1 //===- bolt/Rewrite/RewriteInstance.cpp - ELF rewriter --------------------===// 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 #include "bolt/Rewrite/RewriteInstance.h" 10 #include "bolt/Core/BinaryContext.h" 11 #include "bolt/Core/BinaryEmitter.h" 12 #include "bolt/Core/BinaryFunction.h" 13 #include "bolt/Core/DebugData.h" 14 #include "bolt/Core/Exceptions.h" 15 #include "bolt/Core/MCPlusBuilder.h" 16 #include "bolt/Core/ParallelUtilities.h" 17 #include "bolt/Core/Relocation.h" 18 #include "bolt/Passes/CacheMetrics.h" 19 #include "bolt/Passes/ReorderFunctions.h" 20 #include "bolt/Profile/BoltAddressTranslation.h" 21 #include "bolt/Profile/DataAggregator.h" 22 #include "bolt/Profile/DataReader.h" 23 #include "bolt/Profile/YAMLProfileReader.h" 24 #include "bolt/Profile/YAMLProfileWriter.h" 25 #include "bolt/Rewrite/BinaryPassManager.h" 26 #include "bolt/Rewrite/DWARFRewriter.h" 27 #include "bolt/Rewrite/ExecutableFileMemoryManager.h" 28 #include "bolt/RuntimeLibs/HugifyRuntimeLibrary.h" 29 #include "bolt/RuntimeLibs/InstrumentationRuntimeLibrary.h" 30 #include "bolt/Utils/CommandLineOpts.h" 31 #include "bolt/Utils/Utils.h" 32 #include "llvm/ADT/Optional.h" 33 #include "llvm/DebugInfo/DWARF/DWARFContext.h" 34 #include "llvm/DebugInfo/DWARF/DWARFDebugFrame.h" 35 #include "llvm/ExecutionEngine/RuntimeDyld.h" 36 #include "llvm/MC/MCAsmBackend.h" 37 #include "llvm/MC/MCAsmInfo.h" 38 #include "llvm/MC/MCAsmLayout.h" 39 #include "llvm/MC/MCDisassembler/MCDisassembler.h" 40 #include "llvm/MC/MCObjectStreamer.h" 41 #include "llvm/MC/MCStreamer.h" 42 #include "llvm/MC/MCSymbol.h" 43 #include "llvm/MC/TargetRegistry.h" 44 #include "llvm/Object/ObjectFile.h" 45 #include "llvm/Support/Alignment.h" 46 #include "llvm/Support/Casting.h" 47 #include "llvm/Support/CommandLine.h" 48 #include "llvm/Support/DataExtractor.h" 49 #include "llvm/Support/Errc.h" 50 #include "llvm/Support/Error.h" 51 #include "llvm/Support/FileSystem.h" 52 #include "llvm/Support/LEB128.h" 53 #include "llvm/Support/ManagedStatic.h" 54 #include "llvm/Support/Timer.h" 55 #include "llvm/Support/ToolOutputFile.h" 56 #include "llvm/Support/raw_ostream.h" 57 #include <algorithm> 58 #include <fstream> 59 #include <memory> 60 #include <system_error> 61 62 #undef DEBUG_TYPE 63 #define DEBUG_TYPE "bolt" 64 65 using namespace llvm; 66 using namespace object; 67 using namespace bolt; 68 69 extern cl::opt<uint32_t> X86AlignBranchBoundary; 70 extern cl::opt<bool> X86AlignBranchWithin32BBoundaries; 71 72 namespace opts { 73 74 extern cl::opt<MacroFusionType> AlignMacroOpFusion; 75 extern cl::list<std::string> HotTextMoveSections; 76 extern cl::opt<bool> Hugify; 77 extern cl::opt<bool> Instrument; 78 extern cl::opt<JumpTableSupportLevel> JumpTables; 79 extern cl::list<std::string> ReorderData; 80 extern cl::opt<bolt::ReorderFunctions::ReorderType> ReorderFunctions; 81 extern cl::opt<bool> TimeBuild; 82 83 static cl::opt<bool> 84 ForceToDataRelocations("force-data-relocations", 85 cl::desc("force relocations to data sections to always be processed"), 86 cl::init(false), 87 cl::Hidden, 88 cl::ZeroOrMore, 89 cl::cat(BoltCategory)); 90 91 cl::opt<std::string> 92 BoltID("bolt-id", 93 cl::desc("add any string to tag this execution in the " 94 "output binary via bolt info section"), 95 cl::ZeroOrMore, 96 cl::cat(BoltCategory)); 97 98 cl::opt<bool> 99 AllowStripped("allow-stripped", 100 cl::desc("allow processing of stripped binaries"), 101 cl::Hidden, 102 cl::cat(BoltCategory)); 103 104 cl::opt<bool> 105 DumpDotAll("dump-dot-all", 106 cl::desc("dump function CFGs to graphviz format after each stage"), 107 cl::ZeroOrMore, 108 cl::Hidden, 109 cl::cat(BoltCategory)); 110 111 static cl::list<std::string> 112 ForceFunctionNames("funcs", 113 cl::CommaSeparated, 114 cl::desc("limit optimizations to functions from the list"), 115 cl::value_desc("func1,func2,func3,..."), 116 cl::Hidden, 117 cl::cat(BoltCategory)); 118 119 static cl::opt<std::string> 120 FunctionNamesFile("funcs-file", 121 cl::desc("file with list of functions to optimize"), 122 cl::Hidden, 123 cl::cat(BoltCategory)); 124 125 static cl::list<std::string> ForceFunctionNamesNR( 126 "funcs-no-regex", cl::CommaSeparated, 127 cl::desc("limit optimizations to functions from the list (non-regex)"), 128 cl::value_desc("func1,func2,func3,..."), cl::Hidden, cl::cat(BoltCategory)); 129 130 static cl::opt<std::string> FunctionNamesFileNR( 131 "funcs-file-no-regex", 132 cl::desc("file with list of functions to optimize (non-regex)"), cl::Hidden, 133 cl::cat(BoltCategory)); 134 135 cl::opt<bool> 136 KeepTmp("keep-tmp", 137 cl::desc("preserve intermediate .o file"), 138 cl::Hidden, 139 cl::cat(BoltCategory)); 140 141 cl::opt<bool> 142 Lite("lite", 143 cl::desc("skip processing of cold functions"), 144 cl::init(false), 145 cl::ZeroOrMore, 146 cl::cat(BoltCategory)); 147 148 static cl::opt<unsigned> 149 LiteThresholdPct("lite-threshold-pct", 150 cl::desc("threshold (in percent) for selecting functions to process in lite " 151 "mode. Higher threshold means fewer functions to process. E.g " 152 "threshold of 90 means only top 10 percent of functions with " 153 "profile will be processed."), 154 cl::init(0), 155 cl::ZeroOrMore, 156 cl::Hidden, 157 cl::cat(BoltOptCategory)); 158 159 static cl::opt<unsigned> 160 LiteThresholdCount("lite-threshold-count", 161 cl::desc("similar to '-lite-threshold-pct' but specify threshold using " 162 "absolute function call count. I.e. limit processing to functions " 163 "executed at least the specified number of times."), 164 cl::init(0), 165 cl::ZeroOrMore, 166 cl::Hidden, 167 cl::cat(BoltOptCategory)); 168 169 static cl::opt<unsigned> 170 MaxFunctions("max-funcs", 171 cl::desc("maximum number of functions to process"), 172 cl::ZeroOrMore, 173 cl::Hidden, 174 cl::cat(BoltCategory)); 175 176 static cl::opt<unsigned> 177 MaxDataRelocations("max-data-relocations", 178 cl::desc("maximum number of data relocations to process"), 179 cl::ZeroOrMore, 180 cl::Hidden, 181 cl::cat(BoltCategory)); 182 183 cl::opt<bool> 184 PrintAll("print-all", 185 cl::desc("print functions after each stage"), 186 cl::ZeroOrMore, 187 cl::Hidden, 188 cl::cat(BoltCategory)); 189 190 cl::opt<bool> 191 PrintCFG("print-cfg", 192 cl::desc("print functions after CFG construction"), 193 cl::ZeroOrMore, 194 cl::Hidden, 195 cl::cat(BoltCategory)); 196 197 cl::opt<bool> PrintDisasm("print-disasm", 198 cl::desc("print function after disassembly"), 199 cl::ZeroOrMore, 200 cl::Hidden, 201 cl::cat(BoltCategory)); 202 203 static cl::opt<bool> 204 PrintGlobals("print-globals", 205 cl::desc("print global symbols after disassembly"), 206 cl::ZeroOrMore, 207 cl::Hidden, 208 cl::cat(BoltCategory)); 209 210 extern cl::opt<bool> PrintSections; 211 212 static cl::opt<bool> 213 PrintLoopInfo("print-loops", 214 cl::desc("print loop related information"), 215 cl::ZeroOrMore, 216 cl::Hidden, 217 cl::cat(BoltCategory)); 218 219 static cl::opt<bool> 220 PrintSDTMarkers("print-sdt", 221 cl::desc("print all SDT markers"), 222 cl::ZeroOrMore, 223 cl::Hidden, 224 cl::cat(BoltCategory)); 225 226 enum PrintPseudoProbesOptions { 227 PPP_None = 0, 228 PPP_Probes_Section_Decode = 0x1, 229 PPP_Probes_Address_Conversion = 0x2, 230 PPP_Encoded_Probes = 0x3, 231 PPP_All = 0xf 232 }; 233 234 cl::opt<PrintPseudoProbesOptions> PrintPseudoProbes( 235 "print-pseudo-probes", cl::desc("print pseudo probe info"), 236 cl::init(PPP_None), 237 cl::values(clEnumValN(PPP_Probes_Section_Decode, "decode", 238 "decode probes section from binary"), 239 clEnumValN(PPP_Probes_Address_Conversion, "address_conversion", 240 "update address2ProbesMap with output block address"), 241 clEnumValN(PPP_Encoded_Probes, "encoded_probes", 242 "display the encoded probes in binary section"), 243 clEnumValN(PPP_All, "all", "enable all debugging printout")), 244 cl::ZeroOrMore, cl::Hidden, cl::cat(BoltCategory)); 245 246 static cl::opt<cl::boolOrDefault> 247 RelocationMode("relocs", 248 cl::desc("use relocations in the binary (default=autodetect)"), 249 cl::ZeroOrMore, 250 cl::cat(BoltCategory)); 251 252 static cl::opt<std::string> 253 SaveProfile("w", 254 cl::desc("save recorded profile to a file"), 255 cl::cat(BoltOutputCategory)); 256 257 static cl::list<std::string> 258 SkipFunctionNames("skip-funcs", 259 cl::CommaSeparated, 260 cl::desc("list of functions to skip"), 261 cl::value_desc("func1,func2,func3,..."), 262 cl::Hidden, 263 cl::cat(BoltCategory)); 264 265 static cl::opt<std::string> 266 SkipFunctionNamesFile("skip-funcs-file", 267 cl::desc("file with list of functions to skip"), 268 cl::Hidden, 269 cl::cat(BoltCategory)); 270 271 cl::opt<bool> 272 TrapOldCode("trap-old-code", 273 cl::desc("insert traps in old function bodies (relocation mode)"), 274 cl::Hidden, 275 cl::cat(BoltCategory)); 276 277 static cl::opt<std::string> DWPPathName("dwp", 278 cl::desc("Path and name to DWP file."), 279 cl::Hidden, cl::ZeroOrMore, 280 cl::init(""), cl::cat(BoltCategory)); 281 282 static cl::opt<bool> 283 UseGnuStack("use-gnu-stack", 284 cl::desc("use GNU_STACK program header for new segment (workaround for " 285 "issues with strip/objcopy)"), 286 cl::ZeroOrMore, 287 cl::cat(BoltCategory)); 288 289 static cl::opt<bool> 290 TimeRewrite("time-rewrite", 291 cl::desc("print time spent in rewriting passes"), 292 cl::ZeroOrMore, 293 cl::Hidden, 294 cl::cat(BoltCategory)); 295 296 static cl::opt<bool> 297 SequentialDisassembly("sequential-disassembly", 298 cl::desc("performs disassembly sequentially"), 299 cl::init(false), 300 cl::cat(BoltOptCategory)); 301 302 static cl::opt<bool> 303 WriteBoltInfoSection("bolt-info", 304 cl::desc("write bolt info section in the output binary"), 305 cl::init(true), 306 cl::ZeroOrMore, 307 cl::Hidden, 308 cl::cat(BoltOutputCategory)); 309 310 } // namespace opts 311 312 constexpr const char *RewriteInstance::SectionsToOverwrite[]; 313 std::vector<std::string> RewriteInstance::DebugSectionsToOverwrite = { 314 ".debug_abbrev", ".debug_aranges", ".debug_line", ".debug_loc", 315 ".debug_ranges", ".gdb_index", ".debug_addr"}; 316 317 const char RewriteInstance::TimerGroupName[] = "rewrite"; 318 const char RewriteInstance::TimerGroupDesc[] = "Rewrite passes"; 319 320 namespace llvm { 321 namespace bolt { 322 323 extern const char *BoltRevision; 324 325 MCPlusBuilder *createMCPlusBuilder(const Triple::ArchType Arch, 326 const MCInstrAnalysis *Analysis, 327 const MCInstrInfo *Info, 328 const MCRegisterInfo *RegInfo) { 329 #ifdef X86_AVAILABLE 330 if (Arch == Triple::x86_64) 331 return createX86MCPlusBuilder(Analysis, Info, RegInfo); 332 #endif 333 334 #ifdef AARCH64_AVAILABLE 335 if (Arch == Triple::aarch64) 336 return createAArch64MCPlusBuilder(Analysis, Info, RegInfo); 337 #endif 338 339 llvm_unreachable("architecture unsupported by MCPlusBuilder"); 340 } 341 342 } // namespace bolt 343 } // namespace llvm 344 345 namespace { 346 347 bool refersToReorderedSection(ErrorOr<BinarySection &> Section) { 348 auto Itr = 349 std::find_if(opts::ReorderData.begin(), opts::ReorderData.end(), 350 [&](const std::string &SectionName) { 351 return (Section && Section->getName() == SectionName); 352 }); 353 return Itr != opts::ReorderData.end(); 354 } 355 356 } // anonymous namespace 357 358 Expected<std::unique_ptr<RewriteInstance>> 359 RewriteInstance::createRewriteInstance(ELFObjectFileBase *File, const int Argc, 360 const char *const *Argv, 361 StringRef ToolPath) { 362 Error Err = Error::success(); 363 auto RI = std::make_unique<RewriteInstance>(File, Argc, Argv, ToolPath, Err); 364 if (Err) 365 return std::move(Err); 366 return RI; 367 } 368 369 RewriteInstance::RewriteInstance(ELFObjectFileBase *File, const int Argc, 370 const char *const *Argv, StringRef ToolPath, 371 Error &Err) 372 : InputFile(File), Argc(Argc), Argv(Argv), ToolPath(ToolPath), 373 SHStrTab(StringTableBuilder::ELF) { 374 ErrorAsOutParameter EAO(&Err); 375 auto ELF64LEFile = dyn_cast<ELF64LEObjectFile>(InputFile); 376 if (!ELF64LEFile) { 377 Err = createStringError(errc::not_supported, 378 "Only 64-bit LE ELF binaries are supported"); 379 return; 380 } 381 382 bool IsPIC = false; 383 const ELFFile<ELF64LE> &Obj = ELF64LEFile->getELFFile(); 384 if (Obj.getHeader().e_type != ELF::ET_EXEC) { 385 outs() << "BOLT-INFO: shared object or position-independent executable " 386 "detected\n"; 387 IsPIC = true; 388 } 389 390 auto BCOrErr = BinaryContext::createBinaryContext( 391 File, IsPIC, 392 DWARFContext::create(*File, DWARFContext::ProcessDebugRelocations::Ignore, 393 nullptr, opts::DWPPathName, 394 WithColor::defaultErrorHandler, 395 WithColor::defaultWarningHandler)); 396 if (Error E = BCOrErr.takeError()) { 397 Err = std::move(E); 398 return; 399 } 400 BC = std::move(BCOrErr.get()); 401 BC->initializeTarget(std::unique_ptr<MCPlusBuilder>(createMCPlusBuilder( 402 BC->TheTriple->getArch(), BC->MIA.get(), BC->MII.get(), BC->MRI.get()))); 403 404 BAT = std::make_unique<BoltAddressTranslation>(*BC); 405 406 if (opts::UpdateDebugSections) 407 DebugInfoRewriter = std::make_unique<DWARFRewriter>(*BC); 408 409 if (opts::Instrument) 410 BC->setRuntimeLibrary(std::make_unique<InstrumentationRuntimeLibrary>()); 411 else if (opts::Hugify) 412 BC->setRuntimeLibrary(std::make_unique<HugifyRuntimeLibrary>()); 413 } 414 415 RewriteInstance::~RewriteInstance() {} 416 417 Error RewriteInstance::setProfile(StringRef Filename) { 418 if (!sys::fs::exists(Filename)) 419 return errorCodeToError(make_error_code(errc::no_such_file_or_directory)); 420 421 if (ProfileReader) { 422 // Already exists 423 return make_error<StringError>(Twine("multiple profiles specified: ") + 424 ProfileReader->getFilename() + " and " + 425 Filename, 426 inconvertibleErrorCode()); 427 } 428 429 // Spawn a profile reader based on file contents. 430 if (DataAggregator::checkPerfDataMagic(Filename)) 431 ProfileReader = std::make_unique<DataAggregator>(Filename); 432 else if (YAMLProfileReader::isYAML(Filename)) 433 ProfileReader = std::make_unique<YAMLProfileReader>(Filename); 434 else 435 ProfileReader = std::make_unique<DataReader>(Filename); 436 437 return Error::success(); 438 } 439 440 /// Return true if the function \p BF should be disassembled. 441 static bool shouldDisassemble(const BinaryFunction &BF) { 442 if (BF.isPseudo()) 443 return false; 444 445 if (opts::processAllFunctions()) 446 return true; 447 448 return !BF.isIgnored(); 449 } 450 451 Error RewriteInstance::discoverStorage() { 452 NamedRegionTimer T("discoverStorage", "discover storage", TimerGroupName, 453 TimerGroupDesc, opts::TimeRewrite); 454 455 // Stubs are harmful because RuntimeDyld may try to increase the size of 456 // sections accounting for stubs when we need those sections to match the 457 // same size seen in the input binary, in case this section is a copy 458 // of the original one seen in the binary. 459 BC->EFMM.reset(new ExecutableFileMemoryManager(*BC, /*AllowStubs*/ false)); 460 461 auto ELF64LEFile = dyn_cast<ELF64LEObjectFile>(InputFile); 462 const ELFFile<ELF64LE> &Obj = ELF64LEFile->getELFFile(); 463 464 BC->StartFunctionAddress = Obj.getHeader().e_entry; 465 466 NextAvailableAddress = 0; 467 uint64_t NextAvailableOffset = 0; 468 Expected<ELF64LE::PhdrRange> PHsOrErr = Obj.program_headers(); 469 if (Error E = PHsOrErr.takeError()) 470 return E; 471 472 ELF64LE::PhdrRange PHs = PHsOrErr.get(); 473 for (const ELF64LE::Phdr &Phdr : PHs) { 474 switch (Phdr.p_type) { 475 case ELF::PT_LOAD: 476 BC->FirstAllocAddress = std::min(BC->FirstAllocAddress, 477 static_cast<uint64_t>(Phdr.p_vaddr)); 478 NextAvailableAddress = std::max(NextAvailableAddress, 479 Phdr.p_vaddr + Phdr.p_memsz); 480 NextAvailableOffset = std::max(NextAvailableOffset, 481 Phdr.p_offset + Phdr.p_filesz); 482 483 BC->SegmentMapInfo[Phdr.p_vaddr] = SegmentInfo{Phdr.p_vaddr, 484 Phdr.p_memsz, 485 Phdr.p_offset, 486 Phdr.p_filesz, 487 Phdr.p_align}; 488 break; 489 case ELF::PT_INTERP: 490 BC->HasInterpHeader = true; 491 break; 492 } 493 } 494 495 for (const SectionRef &Section : InputFile->sections()) { 496 Expected<StringRef> SectionNameOrErr = Section.getName(); 497 if (Error E = SectionNameOrErr.takeError()) 498 return E; 499 StringRef SectionName = SectionNameOrErr.get(); 500 if (SectionName == ".text") { 501 BC->OldTextSectionAddress = Section.getAddress(); 502 BC->OldTextSectionSize = Section.getSize(); 503 504 Expected<StringRef> SectionContentsOrErr = Section.getContents(); 505 if (Error E = SectionContentsOrErr.takeError()) 506 return E; 507 StringRef SectionContents = SectionContentsOrErr.get(); 508 BC->OldTextSectionOffset = 509 SectionContents.data() - InputFile->getData().data(); 510 } 511 512 if (!opts::HeatmapMode && 513 !(opts::AggregateOnly && BAT->enabledFor(InputFile)) && 514 (SectionName.startswith(getOrgSecPrefix()) || 515 SectionName == getBOLTTextSectionName())) 516 return createStringError( 517 errc::function_not_supported, 518 "BOLT-ERROR: input file was processed by BOLT. Cannot re-optimize"); 519 } 520 521 if (!NextAvailableAddress || !NextAvailableOffset) 522 return createStringError(errc::executable_format_error, 523 "no PT_LOAD pheader seen"); 524 525 outs() << "BOLT-INFO: first alloc address is 0x" 526 << Twine::utohexstr(BC->FirstAllocAddress) << '\n'; 527 528 FirstNonAllocatableOffset = NextAvailableOffset; 529 530 NextAvailableAddress = alignTo(NextAvailableAddress, BC->PageAlign); 531 NextAvailableOffset = alignTo(NextAvailableOffset, BC->PageAlign); 532 533 if (!opts::UseGnuStack) { 534 // This is where the black magic happens. Creating PHDR table in a segment 535 // other than that containing ELF header is tricky. Some loaders and/or 536 // parts of loaders will apply e_phoff from ELF header assuming both are in 537 // the same segment, while others will do the proper calculation. 538 // We create the new PHDR table in such a way that both of the methods 539 // of loading and locating the table work. There's a slight file size 540 // overhead because of that. 541 // 542 // NB: bfd's strip command cannot do the above and will corrupt the 543 // binary during the process of stripping non-allocatable sections. 544 if (NextAvailableOffset <= NextAvailableAddress - BC->FirstAllocAddress) 545 NextAvailableOffset = NextAvailableAddress - BC->FirstAllocAddress; 546 else 547 NextAvailableAddress = NextAvailableOffset + BC->FirstAllocAddress; 548 549 assert(NextAvailableOffset == 550 NextAvailableAddress - BC->FirstAllocAddress && 551 "PHDR table address calculation error"); 552 553 outs() << "BOLT-INFO: creating new program header table at address 0x" 554 << Twine::utohexstr(NextAvailableAddress) << ", offset 0x" 555 << Twine::utohexstr(NextAvailableOffset) << '\n'; 556 557 PHDRTableAddress = NextAvailableAddress; 558 PHDRTableOffset = NextAvailableOffset; 559 560 // Reserve space for 3 extra pheaders. 561 unsigned Phnum = Obj.getHeader().e_phnum; 562 Phnum += 3; 563 564 NextAvailableAddress += Phnum * sizeof(ELF64LEPhdrTy); 565 NextAvailableOffset += Phnum * sizeof(ELF64LEPhdrTy); 566 } 567 568 // Align at cache line. 569 NextAvailableAddress = alignTo(NextAvailableAddress, 64); 570 NextAvailableOffset = alignTo(NextAvailableOffset, 64); 571 572 NewTextSegmentAddress = NextAvailableAddress; 573 NewTextSegmentOffset = NextAvailableOffset; 574 BC->LayoutStartAddress = NextAvailableAddress; 575 576 // Tools such as objcopy can strip section contents but leave header 577 // entries. Check that at least .text is mapped in the file. 578 if (!getFileOffsetForAddress(BC->OldTextSectionAddress)) 579 return createStringError(errc::executable_format_error, 580 "BOLT-ERROR: input binary is not a valid ELF " 581 "executable as its text section is not " 582 "mapped to a valid segment"); 583 return Error::success(); 584 } 585 586 void RewriteInstance::parseSDTNotes() { 587 if (!SDTSection) 588 return; 589 590 StringRef Buf = SDTSection->getContents(); 591 DataExtractor DE = DataExtractor(Buf, BC->AsmInfo->isLittleEndian(), 592 BC->AsmInfo->getCodePointerSize()); 593 uint64_t Offset = 0; 594 595 while (DE.isValidOffset(Offset)) { 596 uint32_t NameSz = DE.getU32(&Offset); 597 DE.getU32(&Offset); // skip over DescSz 598 uint32_t Type = DE.getU32(&Offset); 599 Offset = alignTo(Offset, 4); 600 601 if (Type != 3) 602 errs() << "BOLT-WARNING: SDT note type \"" << Type 603 << "\" is not expected\n"; 604 605 if (NameSz == 0) 606 errs() << "BOLT-WARNING: SDT note has empty name\n"; 607 608 StringRef Name = DE.getCStr(&Offset); 609 610 if (!Name.equals("stapsdt")) 611 errs() << "BOLT-WARNING: SDT note name \"" << Name 612 << "\" is not expected\n"; 613 614 // Parse description 615 SDTMarkerInfo Marker; 616 Marker.PCOffset = Offset; 617 Marker.PC = DE.getU64(&Offset); 618 Marker.Base = DE.getU64(&Offset); 619 Marker.Semaphore = DE.getU64(&Offset); 620 Marker.Provider = DE.getCStr(&Offset); 621 Marker.Name = DE.getCStr(&Offset); 622 Marker.Args = DE.getCStr(&Offset); 623 Offset = alignTo(Offset, 4); 624 BC->SDTMarkers[Marker.PC] = Marker; 625 } 626 627 if (opts::PrintSDTMarkers) 628 printSDTMarkers(); 629 } 630 631 void RewriteInstance::parsePseudoProbe() { 632 if (!PseudoProbeDescSection && !PseudoProbeSection) { 633 // pesudo probe is not added to binary. It is normal and no warning needed. 634 return; 635 } 636 637 // If only one section is found, it might mean the ELF is corrupted. 638 if (!PseudoProbeDescSection) { 639 errs() << "BOLT-WARNING: fail in reading .pseudo_probe_desc binary\n"; 640 return; 641 } else if (!PseudoProbeSection) { 642 errs() << "BOLT-WARNING: fail in reading .pseudo_probe binary\n"; 643 return; 644 } 645 646 StringRef Contents = PseudoProbeDescSection->getContents(); 647 if (!BC->ProbeDecoder.buildGUID2FuncDescMap( 648 reinterpret_cast<const uint8_t *>(Contents.data()), 649 Contents.size())) { 650 errs() << "BOLT-WARNING: fail in building GUID2FuncDescMap\n"; 651 return; 652 } 653 Contents = PseudoProbeSection->getContents(); 654 if (!BC->ProbeDecoder.buildAddress2ProbeMap( 655 reinterpret_cast<const uint8_t *>(Contents.data()), 656 Contents.size())) { 657 BC->ProbeDecoder.getAddress2ProbesMap().clear(); 658 errs() << "BOLT-WARNING: fail in building Address2ProbeMap\n"; 659 return; 660 } 661 662 if (opts::PrintPseudoProbes == opts::PrintPseudoProbesOptions::PPP_All || 663 opts::PrintPseudoProbes == 664 opts::PrintPseudoProbesOptions::PPP_Probes_Section_Decode) { 665 outs() << "Report of decoding input pseudo probe binaries \n"; 666 BC->ProbeDecoder.printGUID2FuncDescMap(outs()); 667 BC->ProbeDecoder.printProbesForAllAddresses(outs()); 668 } 669 } 670 671 void RewriteInstance::printSDTMarkers() { 672 outs() << "BOLT-INFO: Number of SDT markers is " << BC->SDTMarkers.size() 673 << "\n"; 674 for (auto It : BC->SDTMarkers) { 675 SDTMarkerInfo &Marker = It.second; 676 outs() << "BOLT-INFO: PC: " << utohexstr(Marker.PC) 677 << ", Base: " << utohexstr(Marker.Base) 678 << ", Semaphore: " << utohexstr(Marker.Semaphore) 679 << ", Provider: " << Marker.Provider << ", Name: " << Marker.Name 680 << ", Args: " << Marker.Args << "\n"; 681 } 682 } 683 684 void RewriteInstance::parseBuildID() { 685 if (!BuildIDSection) 686 return; 687 688 StringRef Buf = BuildIDSection->getContents(); 689 690 // Reading notes section (see Portable Formats Specification, Version 1.1, 691 // pg 2-5, section "Note Section"). 692 DataExtractor DE = DataExtractor(Buf, true, 8); 693 uint64_t Offset = 0; 694 if (!DE.isValidOffset(Offset)) 695 return; 696 uint32_t NameSz = DE.getU32(&Offset); 697 if (!DE.isValidOffset(Offset)) 698 return; 699 uint32_t DescSz = DE.getU32(&Offset); 700 if (!DE.isValidOffset(Offset)) 701 return; 702 uint32_t Type = DE.getU32(&Offset); 703 704 LLVM_DEBUG(dbgs() << "NameSz = " << NameSz << "; DescSz = " << DescSz 705 << "; Type = " << Type << "\n"); 706 707 // Type 3 is a GNU build-id note section 708 if (Type != 3) 709 return; 710 711 StringRef Name = Buf.slice(Offset, Offset + NameSz); 712 Offset = alignTo(Offset + NameSz, 4); 713 if (Name.substr(0, 3) != "GNU") 714 return; 715 716 BuildID = Buf.slice(Offset, Offset + DescSz); 717 } 718 719 Optional<std::string> RewriteInstance::getPrintableBuildID() const { 720 if (BuildID.empty()) 721 return NoneType(); 722 723 std::string Str; 724 raw_string_ostream OS(Str); 725 const unsigned char *CharIter = BuildID.bytes_begin(); 726 while (CharIter != BuildID.bytes_end()) { 727 if (*CharIter < 0x10) 728 OS << "0"; 729 OS << Twine::utohexstr(*CharIter); 730 ++CharIter; 731 } 732 return OS.str(); 733 } 734 735 void RewriteInstance::patchBuildID() { 736 raw_fd_ostream &OS = Out->os(); 737 738 if (BuildID.empty()) 739 return; 740 741 size_t IDOffset = BuildIDSection->getContents().rfind(BuildID); 742 assert(IDOffset != StringRef::npos && "failed to patch build-id"); 743 744 uint64_t FileOffset = getFileOffsetForAddress(BuildIDSection->getAddress()); 745 if (!FileOffset) { 746 errs() << "BOLT-WARNING: Non-allocatable build-id will not be updated.\n"; 747 return; 748 } 749 750 char LastIDByte = BuildID[BuildID.size() - 1]; 751 LastIDByte ^= 1; 752 OS.pwrite(&LastIDByte, 1, FileOffset + IDOffset + BuildID.size() - 1); 753 754 outs() << "BOLT-INFO: patched build-id (flipped last bit)\n"; 755 } 756 757 Error RewriteInstance::run() { 758 assert(BC && "failed to create a binary context"); 759 760 outs() << "BOLT-INFO: Target architecture: " 761 << Triple::getArchTypeName( 762 (llvm::Triple::ArchType)InputFile->getArch()) 763 << "\n"; 764 outs() << "BOLT-INFO: BOLT version: " << BoltRevision << "\n"; 765 766 if (Error E = discoverStorage()) 767 return E; 768 if (Error E = readSpecialSections()) 769 return E; 770 adjustCommandLineOptions(); 771 discoverFileObjects(); 772 773 preprocessProfileData(); 774 775 // Skip disassembling if we have a translation table and we are running an 776 // aggregation job. 777 if (opts::AggregateOnly && BAT->enabledFor(InputFile)) { 778 processProfileData(); 779 return Error::success(); 780 } 781 782 selectFunctionsToProcess(); 783 784 readDebugInfo(); 785 786 disassembleFunctions(); 787 788 processProfileDataPreCFG(); 789 790 buildFunctionsCFG(); 791 792 processProfileData(); 793 794 postProcessFunctions(); 795 796 if (opts::DiffOnly) 797 return Error::success(); 798 799 runOptimizationPasses(); 800 801 emitAndLink(); 802 803 updateMetadata(); 804 805 if (opts::LinuxKernelMode) { 806 errs() << "BOLT-WARNING: not writing the output file for Linux Kernel\n"; 807 return Error::success(); 808 } else if (opts::OutputFilename == "/dev/null") { 809 outs() << "BOLT-INFO: skipping writing final binary to disk\n"; 810 return Error::success(); 811 } 812 813 // Rewrite allocatable contents and copy non-allocatable parts with mods. 814 rewriteFile(); 815 return Error::success(); 816 } 817 818 void RewriteInstance::discoverFileObjects() { 819 NamedRegionTimer T("discoverFileObjects", "discover file objects", 820 TimerGroupName, TimerGroupDesc, opts::TimeRewrite); 821 FileSymRefs.clear(); 822 BC->getBinaryFunctions().clear(); 823 BC->clearBinaryData(); 824 825 // For local symbols we want to keep track of associated FILE symbol name for 826 // disambiguation by combined name. 827 StringRef FileSymbolName; 828 bool SeenFileName = false; 829 struct SymbolRefHash { 830 size_t operator()(SymbolRef const &S) const { 831 return std::hash<decltype(DataRefImpl::p)>{}(S.getRawDataRefImpl().p); 832 } 833 }; 834 std::unordered_map<SymbolRef, StringRef, SymbolRefHash> SymbolToFileName; 835 for (const ELFSymbolRef &Symbol : InputFile->symbols()) { 836 Expected<StringRef> NameOrError = Symbol.getName(); 837 if (NameOrError && NameOrError->startswith("__asan_init")) { 838 errs() << "BOLT-ERROR: input file was compiled or linked with sanitizer " 839 "support. Cannot optimize.\n"; 840 exit(1); 841 } 842 if (NameOrError && NameOrError->startswith("__llvm_coverage_mapping")) { 843 errs() << "BOLT-ERROR: input file was compiled or linked with coverage " 844 "support. Cannot optimize.\n"; 845 exit(1); 846 } 847 848 if (cantFail(Symbol.getFlags()) & SymbolRef::SF_Undefined) 849 continue; 850 851 if (cantFail(Symbol.getType()) == SymbolRef::ST_File) { 852 StringRef Name = 853 cantFail(std::move(NameOrError), "cannot get symbol name for file"); 854 // Ignore Clang LTO artificial FILE symbol as it is not always generated, 855 // and this uncertainty is causing havoc in function name matching. 856 if (Name == "ld-temp.o") 857 continue; 858 FileSymbolName = Name; 859 SeenFileName = true; 860 continue; 861 } 862 if (!FileSymbolName.empty() && 863 !(cantFail(Symbol.getFlags()) & SymbolRef::SF_Global)) 864 SymbolToFileName[Symbol] = FileSymbolName; 865 } 866 867 // Sort symbols in the file by value. Ignore symbols from non-allocatable 868 // sections. 869 auto isSymbolInMemory = [this](const SymbolRef &Sym) { 870 if (cantFail(Sym.getType()) == SymbolRef::ST_File) 871 return false; 872 if (cantFail(Sym.getFlags()) & SymbolRef::SF_Absolute) 873 return true; 874 if (cantFail(Sym.getFlags()) & SymbolRef::SF_Undefined) 875 return false; 876 BinarySection Section(*BC, *cantFail(Sym.getSection())); 877 return Section.isAllocatable(); 878 }; 879 std::vector<SymbolRef> SortedFileSymbols; 880 std::copy_if(InputFile->symbol_begin(), InputFile->symbol_end(), 881 std::back_inserter(SortedFileSymbols), isSymbolInMemory); 882 883 std::stable_sort( 884 SortedFileSymbols.begin(), SortedFileSymbols.end(), 885 [](const SymbolRef &A, const SymbolRef &B) { 886 // FUNC symbols have the highest precedence, while SECTIONs 887 // have the lowest. 888 uint64_t AddressA = cantFail(A.getAddress()); 889 uint64_t AddressB = cantFail(B.getAddress()); 890 if (AddressA != AddressB) 891 return AddressA < AddressB; 892 893 SymbolRef::Type AType = cantFail(A.getType()); 894 SymbolRef::Type BType = cantFail(B.getType()); 895 if (AType == SymbolRef::ST_Function && BType != SymbolRef::ST_Function) 896 return true; 897 if (BType == SymbolRef::ST_Debug && AType != SymbolRef::ST_Debug) 898 return true; 899 900 return false; 901 }); 902 903 // For aarch64, the ABI defines mapping symbols so we identify data in the 904 // code section (see IHI0056B). $d identifies data contents. 905 auto LastSymbol = SortedFileSymbols.end() - 1; 906 if (BC->isAArch64()) { 907 LastSymbol = std::stable_partition( 908 SortedFileSymbols.begin(), SortedFileSymbols.end(), 909 [](const SymbolRef &Symbol) { 910 StringRef Name = cantFail(Symbol.getName()); 911 return !(cantFail(Symbol.getType()) == SymbolRef::ST_Unknown && 912 (Name == "$d" || Name.startswith("$d.") || Name == "$x" || 913 Name.startswith("$x."))); 914 }); 915 --LastSymbol; 916 } 917 918 BinaryFunction *PreviousFunction = nullptr; 919 unsigned AnonymousId = 0; 920 921 const auto MarkersBegin = std::next(LastSymbol); 922 for (auto ISym = SortedFileSymbols.begin(); ISym != MarkersBegin; ++ISym) { 923 const SymbolRef &Symbol = *ISym; 924 // Keep undefined symbols for pretty printing? 925 if (cantFail(Symbol.getFlags()) & SymbolRef::SF_Undefined) 926 continue; 927 928 const SymbolRef::Type SymbolType = cantFail(Symbol.getType()); 929 930 if (SymbolType == SymbolRef::ST_File) 931 continue; 932 933 StringRef SymName = cantFail(Symbol.getName(), "cannot get symbol name"); 934 uint64_t Address = 935 cantFail(Symbol.getAddress(), "cannot get symbol address"); 936 if (Address == 0) { 937 if (opts::Verbosity >= 1 && SymbolType == SymbolRef::ST_Function) 938 errs() << "BOLT-WARNING: function with 0 address seen\n"; 939 continue; 940 } 941 942 // Ignore input hot markers 943 if (SymName == "__hot_start" || SymName == "__hot_end") 944 continue; 945 946 FileSymRefs[Address] = Symbol; 947 948 // Skip section symbols that will be registered by disassemblePLT(). 949 if ((cantFail(Symbol.getType()) == SymbolRef::ST_Debug)) { 950 ErrorOr<BinarySection &> BSection = BC->getSectionForAddress(Address); 951 if (BSection && getPLTSectionInfo(BSection->getName())) 952 continue; 953 } 954 955 /// It is possible we are seeing a globalized local. LLVM might treat it as 956 /// a local if it has a "private global" prefix, e.g. ".L". Thus we have to 957 /// change the prefix to enforce global scope of the symbol. 958 std::string Name = SymName.startswith(BC->AsmInfo->getPrivateGlobalPrefix()) 959 ? "PG" + std::string(SymName) 960 : std::string(SymName); 961 962 // Disambiguate all local symbols before adding to symbol table. 963 // Since we don't know if we will see a global with the same name, 964 // always modify the local name. 965 // 966 // NOTE: the naming convention for local symbols should match 967 // the one we use for profile data. 968 std::string UniqueName; 969 std::string AlternativeName; 970 if (Name.empty()) { 971 UniqueName = "ANONYMOUS." + std::to_string(AnonymousId++); 972 } else if (cantFail(Symbol.getFlags()) & SymbolRef::SF_Global) { 973 assert(!BC->getBinaryDataByName(Name) && "global name not unique"); 974 UniqueName = Name; 975 } else { 976 // If we have a local file name, we should create 2 variants for the 977 // function name. The reason is that perf profile might have been 978 // collected on a binary that did not have the local file name (e.g. as 979 // a side effect of stripping debug info from the binary): 980 // 981 // primary: <function>/<id> 982 // alternative: <function>/<file>/<id2> 983 // 984 // The <id> field is used for disambiguation of local symbols since there 985 // could be identical function names coming from identical file names 986 // (e.g. from different directories). 987 std::string AltPrefix; 988 auto SFI = SymbolToFileName.find(Symbol); 989 if (SymbolType == SymbolRef::ST_Function && SFI != SymbolToFileName.end()) 990 AltPrefix = Name + "/" + std::string(SFI->second); 991 992 UniqueName = NR.uniquify(Name); 993 if (!AltPrefix.empty()) 994 AlternativeName = NR.uniquify(AltPrefix); 995 } 996 997 uint64_t SymbolSize = ELFSymbolRef(Symbol).getSize(); 998 uint64_t SymbolAlignment = Symbol.getAlignment(); 999 unsigned SymbolFlags = cantFail(Symbol.getFlags()); 1000 1001 auto registerName = [&](uint64_t FinalSize) { 1002 // Register names even if it's not a function, e.g. for an entry point. 1003 BC->registerNameAtAddress(UniqueName, Address, FinalSize, SymbolAlignment, 1004 SymbolFlags); 1005 if (!AlternativeName.empty()) 1006 BC->registerNameAtAddress(AlternativeName, Address, FinalSize, 1007 SymbolAlignment, SymbolFlags); 1008 }; 1009 1010 section_iterator Section = 1011 cantFail(Symbol.getSection(), "cannot get symbol section"); 1012 if (Section == InputFile->section_end()) { 1013 // Could be an absolute symbol. Could record for pretty printing. 1014 LLVM_DEBUG(if (opts::Verbosity > 1) { 1015 dbgs() << "BOLT-INFO: absolute sym " << UniqueName << "\n"; 1016 }); 1017 registerName(SymbolSize); 1018 continue; 1019 } 1020 1021 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: considering symbol " << UniqueName 1022 << " for function\n"); 1023 1024 if (!Section->isText()) { 1025 assert(SymbolType != SymbolRef::ST_Function && 1026 "unexpected function inside non-code section"); 1027 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: rejecting as symbol is not in code\n"); 1028 registerName(SymbolSize); 1029 continue; 1030 } 1031 1032 // Assembly functions could be ST_NONE with 0 size. Check that the 1033 // corresponding section is a code section and they are not inside any 1034 // other known function to consider them. 1035 // 1036 // Sometimes assembly functions are not marked as functions and neither are 1037 // their local labels. The only way to tell them apart is to look at 1038 // symbol scope - global vs local. 1039 if (PreviousFunction && SymbolType != SymbolRef::ST_Function) { 1040 if (PreviousFunction->containsAddress(Address)) { 1041 if (PreviousFunction->isSymbolValidInScope(Symbol, SymbolSize)) { 1042 LLVM_DEBUG(dbgs() 1043 << "BOLT-DEBUG: symbol is a function local symbol\n"); 1044 } else if (Address == PreviousFunction->getAddress() && !SymbolSize) { 1045 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: ignoring symbol as a marker\n"); 1046 } else if (opts::Verbosity > 1) { 1047 errs() << "BOLT-WARNING: symbol " << UniqueName 1048 << " seen in the middle of function " << *PreviousFunction 1049 << ". Could be a new entry.\n"; 1050 } 1051 registerName(SymbolSize); 1052 continue; 1053 } else if (PreviousFunction->getSize() == 0 && 1054 PreviousFunction->isSymbolValidInScope(Symbol, SymbolSize)) { 1055 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: symbol is a function local symbol\n"); 1056 registerName(SymbolSize); 1057 continue; 1058 } 1059 } 1060 1061 if (PreviousFunction && PreviousFunction->containsAddress(Address) && 1062 PreviousFunction->getAddress() != Address) { 1063 if (PreviousFunction->isSymbolValidInScope(Symbol, SymbolSize)) { 1064 if (opts::Verbosity >= 1) 1065 outs() << "BOLT-INFO: skipping possibly another entry for function " 1066 << *PreviousFunction << " : " << UniqueName << '\n'; 1067 } else { 1068 outs() << "BOLT-INFO: using " << UniqueName << " as another entry to " 1069 << "function " << *PreviousFunction << '\n'; 1070 1071 registerName(0); 1072 1073 PreviousFunction->addEntryPointAtOffset(Address - 1074 PreviousFunction->getAddress()); 1075 1076 // Remove the symbol from FileSymRefs so that we can skip it from 1077 // in the future. 1078 auto SI = FileSymRefs.find(Address); 1079 assert(SI != FileSymRefs.end() && "symbol expected to be present"); 1080 assert(SI->second == Symbol && "wrong symbol found"); 1081 FileSymRefs.erase(SI); 1082 } 1083 registerName(SymbolSize); 1084 continue; 1085 } 1086 1087 // Checkout for conflicts with function data from FDEs. 1088 bool IsSimple = true; 1089 auto FDEI = CFIRdWrt->getFDEs().lower_bound(Address); 1090 if (FDEI != CFIRdWrt->getFDEs().end()) { 1091 const dwarf::FDE &FDE = *FDEI->second; 1092 if (FDEI->first != Address) { 1093 // There's no matching starting address in FDE. Make sure the previous 1094 // FDE does not contain this address. 1095 if (FDEI != CFIRdWrt->getFDEs().begin()) { 1096 --FDEI; 1097 const dwarf::FDE &PrevFDE = *FDEI->second; 1098 uint64_t PrevStart = PrevFDE.getInitialLocation(); 1099 uint64_t PrevLength = PrevFDE.getAddressRange(); 1100 if (Address > PrevStart && Address < PrevStart + PrevLength) { 1101 errs() << "BOLT-ERROR: function " << UniqueName 1102 << " is in conflict with FDE [" 1103 << Twine::utohexstr(PrevStart) << ", " 1104 << Twine::utohexstr(PrevStart + PrevLength) 1105 << "). Skipping.\n"; 1106 IsSimple = false; 1107 } 1108 } 1109 } else if (FDE.getAddressRange() != SymbolSize) { 1110 if (SymbolSize) { 1111 // Function addresses match but sizes differ. 1112 errs() << "BOLT-WARNING: sizes differ for function " << UniqueName 1113 << ". FDE : " << FDE.getAddressRange() 1114 << "; symbol table : " << SymbolSize << ". Using max size.\n"; 1115 } 1116 SymbolSize = std::max(SymbolSize, FDE.getAddressRange()); 1117 if (BC->getBinaryDataAtAddress(Address)) { 1118 BC->setBinaryDataSize(Address, SymbolSize); 1119 } else { 1120 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: No BD @ 0x" 1121 << Twine::utohexstr(Address) << "\n"); 1122 } 1123 } 1124 } 1125 1126 BinaryFunction *BF = nullptr; 1127 // Since function may not have yet obtained its real size, do a search 1128 // using the list of registered functions instead of calling 1129 // getBinaryFunctionAtAddress(). 1130 auto BFI = BC->getBinaryFunctions().find(Address); 1131 if (BFI != BC->getBinaryFunctions().end()) { 1132 BF = &BFI->second; 1133 // Duplicate the function name. Make sure everything matches before we add 1134 // an alternative name. 1135 if (SymbolSize != BF->getSize()) { 1136 if (opts::Verbosity >= 1) { 1137 if (SymbolSize && BF->getSize()) 1138 errs() << "BOLT-WARNING: size mismatch for duplicate entries " 1139 << *BF << " and " << UniqueName << '\n'; 1140 outs() << "BOLT-INFO: adjusting size of function " << *BF << " old " 1141 << BF->getSize() << " new " << SymbolSize << "\n"; 1142 } 1143 BF->setSize(std::max(SymbolSize, BF->getSize())); 1144 BC->setBinaryDataSize(Address, BF->getSize()); 1145 } 1146 BF->addAlternativeName(UniqueName); 1147 } else { 1148 ErrorOr<BinarySection &> Section = BC->getSectionForAddress(Address); 1149 // Skip symbols from invalid sections 1150 if (!Section) { 1151 errs() << "BOLT-WARNING: " << UniqueName << " (0x" 1152 << Twine::utohexstr(Address) << ") does not have any section\n"; 1153 continue; 1154 } 1155 assert(Section && "section for functions must be registered"); 1156 1157 // Skip symbols from zero-sized sections. 1158 if (!Section->getSize()) 1159 continue; 1160 1161 BF = BC->createBinaryFunction(UniqueName, *Section, Address, SymbolSize); 1162 if (!IsSimple) 1163 BF->setSimple(false); 1164 } 1165 if (!AlternativeName.empty()) 1166 BF->addAlternativeName(AlternativeName); 1167 1168 registerName(SymbolSize); 1169 PreviousFunction = BF; 1170 } 1171 1172 // Read dynamic relocation first as their presence affects the way we process 1173 // static relocations. E.g. we will ignore a static relocation at an address 1174 // that is a subject to dynamic relocation processing. 1175 processDynamicRelocations(); 1176 1177 // Process PLT section. 1178 disassemblePLT(); 1179 1180 // See if we missed any functions marked by FDE. 1181 for (const auto &FDEI : CFIRdWrt->getFDEs()) { 1182 const uint64_t Address = FDEI.first; 1183 const dwarf::FDE *FDE = FDEI.second; 1184 const BinaryFunction *BF = BC->getBinaryFunctionAtAddress(Address); 1185 if (BF) 1186 continue; 1187 1188 BF = BC->getBinaryFunctionContainingAddress(Address); 1189 if (BF) { 1190 errs() << "BOLT-WARNING: FDE [0x" << Twine::utohexstr(Address) << ", 0x" 1191 << Twine::utohexstr(Address + FDE->getAddressRange()) 1192 << ") conflicts with function " << *BF << '\n'; 1193 continue; 1194 } 1195 1196 if (opts::Verbosity >= 1) 1197 errs() << "BOLT-WARNING: FDE [0x" << Twine::utohexstr(Address) << ", 0x" 1198 << Twine::utohexstr(Address + FDE->getAddressRange()) 1199 << ") has no corresponding symbol table entry\n"; 1200 1201 ErrorOr<BinarySection &> Section = BC->getSectionForAddress(Address); 1202 assert(Section && "cannot get section for address from FDE"); 1203 std::string FunctionName = 1204 "__BOLT_FDE_FUNCat" + Twine::utohexstr(Address).str(); 1205 BC->createBinaryFunction(FunctionName, *Section, Address, 1206 FDE->getAddressRange()); 1207 } 1208 1209 BC->setHasSymbolsWithFileName(SeenFileName); 1210 1211 // Now that all the functions were created - adjust their boundaries. 1212 adjustFunctionBoundaries(); 1213 1214 // Annotate functions with code/data markers in AArch64 1215 for (auto ISym = MarkersBegin; ISym != SortedFileSymbols.end(); ++ISym) { 1216 const SymbolRef &Symbol = *ISym; 1217 uint64_t Address = 1218 cantFail(Symbol.getAddress(), "cannot get symbol address"); 1219 uint64_t SymbolSize = ELFSymbolRef(Symbol).getSize(); 1220 BinaryFunction *BF = 1221 BC->getBinaryFunctionContainingAddress(Address, true, true); 1222 if (!BF) { 1223 // Stray marker 1224 continue; 1225 } 1226 const uint64_t EntryOffset = Address - BF->getAddress(); 1227 if (BF->isCodeMarker(Symbol, SymbolSize)) { 1228 BF->markCodeAtOffset(EntryOffset); 1229 continue; 1230 } 1231 if (BF->isDataMarker(Symbol, SymbolSize)) { 1232 BF->markDataAtOffset(EntryOffset); 1233 BC->AddressToConstantIslandMap[Address] = BF; 1234 continue; 1235 } 1236 llvm_unreachable("Unknown marker"); 1237 } 1238 1239 if (opts::LinuxKernelMode) { 1240 // Read all special linux kernel sections and their relocations 1241 processLKSections(); 1242 } else { 1243 // Read all relocations now that we have binary functions mapped. 1244 processRelocations(); 1245 } 1246 } 1247 1248 void RewriteInstance::createPLTBinaryFunction(uint64_t TargetAddress, 1249 uint64_t EntryAddress, 1250 uint64_t EntrySize) { 1251 if (!TargetAddress) 1252 return; 1253 1254 auto setPLTSymbol = [&](BinaryFunction *BF, StringRef Name) { 1255 const unsigned PtrSize = BC->AsmInfo->getCodePointerSize(); 1256 MCSymbol *TargetSymbol = BC->registerNameAtAddress( 1257 Name.str() + "@GOT", TargetAddress, PtrSize, PtrSize); 1258 BF->setPLTSymbol(TargetSymbol); 1259 }; 1260 1261 BinaryFunction *BF = BC->getBinaryFunctionAtAddress(EntryAddress); 1262 if (BF && BC->isAArch64()) { 1263 // Handle IFUNC trampoline 1264 setPLTSymbol(BF, BF->getOneName()); 1265 return; 1266 } 1267 1268 const Relocation *Rel = BC->getDynamicRelocationAt(TargetAddress); 1269 if (!Rel || !Rel->Symbol) 1270 return; 1271 1272 ErrorOr<BinarySection &> Section = BC->getSectionForAddress(EntryAddress); 1273 assert(Section && "cannot get section for address"); 1274 BF = BC->createBinaryFunction(Rel->Symbol->getName().str() + "@PLT", *Section, 1275 EntryAddress, 0, EntrySize, 1276 Section->getAlignment()); 1277 setPLTSymbol(BF, Rel->Symbol->getName()); 1278 } 1279 1280 void RewriteInstance::disassemblePLTSectionAArch64(BinarySection &Section) { 1281 const uint64_t SectionAddress = Section.getAddress(); 1282 const uint64_t SectionSize = Section.getSize(); 1283 StringRef PLTContents = Section.getContents(); 1284 ArrayRef<uint8_t> PLTData( 1285 reinterpret_cast<const uint8_t *>(PLTContents.data()), SectionSize); 1286 1287 auto disassembleInstruction = [&](uint64_t InstrOffset, MCInst &Instruction, 1288 uint64_t &InstrSize) { 1289 const uint64_t InstrAddr = SectionAddress + InstrOffset; 1290 if (!BC->DisAsm->getInstruction(Instruction, InstrSize, 1291 PLTData.slice(InstrOffset), InstrAddr, 1292 nulls())) { 1293 errs() << "BOLT-ERROR: unable to disassemble instruction in PLT section " 1294 << Section.getName() << " at offset 0x" 1295 << Twine::utohexstr(InstrOffset) << '\n'; 1296 exit(1); 1297 } 1298 }; 1299 1300 uint64_t InstrOffset = 0; 1301 // Locate new plt entry 1302 while (InstrOffset < SectionSize) { 1303 InstructionListType Instructions; 1304 MCInst Instruction; 1305 uint64_t EntryOffset = InstrOffset; 1306 uint64_t EntrySize = 0; 1307 uint64_t InstrSize; 1308 // Loop through entry instructions 1309 while (InstrOffset < SectionSize) { 1310 disassembleInstruction(InstrOffset, Instruction, InstrSize); 1311 EntrySize += InstrSize; 1312 if (!BC->MIB->isIndirectBranch(Instruction)) { 1313 Instructions.emplace_back(Instruction); 1314 InstrOffset += InstrSize; 1315 continue; 1316 } 1317 1318 const uint64_t EntryAddress = SectionAddress + EntryOffset; 1319 const uint64_t TargetAddress = BC->MIB->analyzePLTEntry( 1320 Instruction, Instructions.begin(), Instructions.end(), EntryAddress); 1321 1322 createPLTBinaryFunction(TargetAddress, EntryAddress, EntrySize); 1323 break; 1324 } 1325 1326 // Branch instruction 1327 InstrOffset += InstrSize; 1328 1329 // Skip nops if any 1330 while (InstrOffset < SectionSize) { 1331 disassembleInstruction(InstrOffset, Instruction, InstrSize); 1332 if (!BC->MIB->isNoop(Instruction)) 1333 break; 1334 1335 InstrOffset += InstrSize; 1336 } 1337 } 1338 } 1339 1340 void RewriteInstance::disassemblePLTSectionX86(BinarySection &Section, 1341 uint64_t EntrySize) { 1342 const uint64_t SectionAddress = Section.getAddress(); 1343 const uint64_t SectionSize = Section.getSize(); 1344 StringRef PLTContents = Section.getContents(); 1345 ArrayRef<uint8_t> PLTData( 1346 reinterpret_cast<const uint8_t *>(PLTContents.data()), SectionSize); 1347 1348 auto disassembleInstruction = [&](uint64_t InstrOffset, MCInst &Instruction, 1349 uint64_t &InstrSize) { 1350 const uint64_t InstrAddr = SectionAddress + InstrOffset; 1351 if (!BC->DisAsm->getInstruction(Instruction, InstrSize, 1352 PLTData.slice(InstrOffset), InstrAddr, 1353 nulls())) { 1354 errs() << "BOLT-ERROR: unable to disassemble instruction in PLT section " 1355 << Section.getName() << " at offset 0x" 1356 << Twine::utohexstr(InstrOffset) << '\n'; 1357 exit(1); 1358 } 1359 }; 1360 1361 for (uint64_t EntryOffset = 0; EntryOffset + EntrySize <= SectionSize; 1362 EntryOffset += EntrySize) { 1363 MCInst Instruction; 1364 uint64_t InstrSize, InstrOffset = EntryOffset; 1365 while (InstrOffset < EntryOffset + EntrySize) { 1366 disassembleInstruction(InstrOffset, Instruction, InstrSize); 1367 // Check if the entry size needs adjustment. 1368 if (EntryOffset == 0 && BC->MIB->isTerminateBranch(Instruction) && 1369 EntrySize == 8) 1370 EntrySize = 16; 1371 1372 if (BC->MIB->isIndirectBranch(Instruction)) 1373 break; 1374 1375 InstrOffset += InstrSize; 1376 } 1377 1378 if (InstrOffset + InstrSize > EntryOffset + EntrySize) 1379 continue; 1380 1381 uint64_t TargetAddress; 1382 if (!BC->MIB->evaluateMemOperandTarget(Instruction, TargetAddress, 1383 SectionAddress + InstrOffset, 1384 InstrSize)) { 1385 errs() << "BOLT-ERROR: error evaluating PLT instruction at offset 0x" 1386 << Twine::utohexstr(SectionAddress + InstrOffset) << '\n'; 1387 exit(1); 1388 } 1389 1390 createPLTBinaryFunction(TargetAddress, SectionAddress + EntryOffset, 1391 EntrySize); 1392 } 1393 } 1394 1395 void RewriteInstance::disassemblePLT() { 1396 auto analyzeOnePLTSection = [&](BinarySection &Section, uint64_t EntrySize) { 1397 if (BC->isAArch64()) 1398 return disassemblePLTSectionAArch64(Section); 1399 return disassemblePLTSectionX86(Section, EntrySize); 1400 }; 1401 1402 for (BinarySection &Section : BC->allocatableSections()) { 1403 const PLTSectionInfo *PLTSI = getPLTSectionInfo(Section.getName()); 1404 if (!PLTSI) 1405 continue; 1406 1407 analyzeOnePLTSection(Section, PLTSI->EntrySize); 1408 // If we did not register any function at the start of the section, 1409 // then it must be a general PLT entry. Add a function at the location. 1410 if (BC->getBinaryFunctions().find(Section.getAddress()) == 1411 BC->getBinaryFunctions().end()) { 1412 BinaryFunction *BF = BC->createBinaryFunction( 1413 "__BOLT_PSEUDO_" + Section.getName().str(), Section, 1414 Section.getAddress(), 0, PLTSI->EntrySize, Section.getAlignment()); 1415 BF->setPseudo(true); 1416 } 1417 } 1418 } 1419 1420 void RewriteInstance::adjustFunctionBoundaries() { 1421 for (auto BFI = BC->getBinaryFunctions().begin(), 1422 BFE = BC->getBinaryFunctions().end(); 1423 BFI != BFE; ++BFI) { 1424 BinaryFunction &Function = BFI->second; 1425 const BinaryFunction *NextFunction = nullptr; 1426 if (std::next(BFI) != BFE) 1427 NextFunction = &std::next(BFI)->second; 1428 1429 // Check if it's a fragment of a function. 1430 Optional<StringRef> FragName = 1431 Function.hasRestoredNameRegex(".*\\.cold(\\.[0-9]+)?"); 1432 if (FragName) { 1433 static bool PrintedWarning = false; 1434 if (BC->HasRelocations && !PrintedWarning) { 1435 errs() << "BOLT-WARNING: split function detected on input : " 1436 << *FragName << ". The support is limited in relocation mode.\n"; 1437 PrintedWarning = true; 1438 } 1439 Function.IsFragment = true; 1440 } 1441 1442 // Check if there's a symbol or a function with a larger address in the 1443 // same section. If there is - it determines the maximum size for the 1444 // current function. Otherwise, it is the size of a containing section 1445 // the defines it. 1446 // 1447 // NOTE: ignore some symbols that could be tolerated inside the body 1448 // of a function. 1449 auto NextSymRefI = FileSymRefs.upper_bound(Function.getAddress()); 1450 while (NextSymRefI != FileSymRefs.end()) { 1451 SymbolRef &Symbol = NextSymRefI->second; 1452 const uint64_t SymbolAddress = NextSymRefI->first; 1453 const uint64_t SymbolSize = ELFSymbolRef(Symbol).getSize(); 1454 1455 if (NextFunction && SymbolAddress >= NextFunction->getAddress()) 1456 break; 1457 1458 if (!Function.isSymbolValidInScope(Symbol, SymbolSize)) 1459 break; 1460 1461 // This is potentially another entry point into the function. 1462 uint64_t EntryOffset = NextSymRefI->first - Function.getAddress(); 1463 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: adding entry point to function " 1464 << Function << " at offset 0x" 1465 << Twine::utohexstr(EntryOffset) << '\n'); 1466 Function.addEntryPointAtOffset(EntryOffset); 1467 1468 ++NextSymRefI; 1469 } 1470 1471 // Function runs at most till the end of the containing section. 1472 uint64_t NextObjectAddress = Function.getOriginSection()->getEndAddress(); 1473 // Or till the next object marked by a symbol. 1474 if (NextSymRefI != FileSymRefs.end()) 1475 NextObjectAddress = std::min(NextSymRefI->first, NextObjectAddress); 1476 1477 // Or till the next function not marked by a symbol. 1478 if (NextFunction) 1479 NextObjectAddress = 1480 std::min(NextFunction->getAddress(), NextObjectAddress); 1481 1482 const uint64_t MaxSize = NextObjectAddress - Function.getAddress(); 1483 if (MaxSize < Function.getSize()) { 1484 errs() << "BOLT-ERROR: symbol seen in the middle of the function " 1485 << Function << ". Skipping.\n"; 1486 Function.setSimple(false); 1487 Function.setMaxSize(Function.getSize()); 1488 continue; 1489 } 1490 Function.setMaxSize(MaxSize); 1491 if (!Function.getSize() && Function.isSimple()) { 1492 // Some assembly functions have their size set to 0, use the max 1493 // size as their real size. 1494 if (opts::Verbosity >= 1) 1495 outs() << "BOLT-INFO: setting size of function " << Function << " to " 1496 << Function.getMaxSize() << " (was 0)\n"; 1497 Function.setSize(Function.getMaxSize()); 1498 } 1499 } 1500 } 1501 1502 void RewriteInstance::relocateEHFrameSection() { 1503 assert(EHFrameSection && "non-empty .eh_frame section expected"); 1504 1505 DWARFDataExtractor DE(EHFrameSection->getContents(), 1506 BC->AsmInfo->isLittleEndian(), 1507 BC->AsmInfo->getCodePointerSize()); 1508 auto createReloc = [&](uint64_t Value, uint64_t Offset, uint64_t DwarfType) { 1509 if (DwarfType == dwarf::DW_EH_PE_omit) 1510 return; 1511 1512 // Only fix references that are relative to other locations. 1513 if (!(DwarfType & dwarf::DW_EH_PE_pcrel) && 1514 !(DwarfType & dwarf::DW_EH_PE_textrel) && 1515 !(DwarfType & dwarf::DW_EH_PE_funcrel) && 1516 !(DwarfType & dwarf::DW_EH_PE_datarel)) 1517 return; 1518 1519 if (!(DwarfType & dwarf::DW_EH_PE_sdata4)) 1520 return; 1521 1522 uint64_t RelType; 1523 switch (DwarfType & 0x0f) { 1524 default: 1525 llvm_unreachable("unsupported DWARF encoding type"); 1526 case dwarf::DW_EH_PE_sdata4: 1527 case dwarf::DW_EH_PE_udata4: 1528 RelType = Relocation::getPC32(); 1529 Offset -= 4; 1530 break; 1531 case dwarf::DW_EH_PE_sdata8: 1532 case dwarf::DW_EH_PE_udata8: 1533 RelType = Relocation::getPC64(); 1534 Offset -= 8; 1535 break; 1536 } 1537 1538 // Create a relocation against an absolute value since the goal is to 1539 // preserve the contents of the section independent of the new values 1540 // of referenced symbols. 1541 EHFrameSection->addRelocation(Offset, nullptr, RelType, Value); 1542 }; 1543 1544 Error E = EHFrameParser::parse(DE, EHFrameSection->getAddress(), createReloc); 1545 check_error(std::move(E), "failed to patch EH frame"); 1546 } 1547 1548 ArrayRef<uint8_t> RewriteInstance::getLSDAData() { 1549 return ArrayRef<uint8_t>(LSDASection->getData(), 1550 LSDASection->getContents().size()); 1551 } 1552 1553 uint64_t RewriteInstance::getLSDAAddress() { return LSDASection->getAddress(); } 1554 1555 Error RewriteInstance::readSpecialSections() { 1556 NamedRegionTimer T("readSpecialSections", "read special sections", 1557 TimerGroupName, TimerGroupDesc, opts::TimeRewrite); 1558 1559 bool HasTextRelocations = false; 1560 bool HasDebugInfo = false; 1561 1562 // Process special sections. 1563 for (const SectionRef &Section : InputFile->sections()) { 1564 Expected<StringRef> SectionNameOrErr = Section.getName(); 1565 check_error(SectionNameOrErr.takeError(), "cannot get section name"); 1566 StringRef SectionName = *SectionNameOrErr; 1567 1568 // Only register sections with names. 1569 if (!SectionName.empty()) { 1570 if (Error E = Section.getContents().takeError()) 1571 return E; 1572 BC->registerSection(Section); 1573 LLVM_DEBUG( 1574 dbgs() << "BOLT-DEBUG: registering section " << SectionName << " @ 0x" 1575 << Twine::utohexstr(Section.getAddress()) << ":0x" 1576 << Twine::utohexstr(Section.getAddress() + Section.getSize()) 1577 << "\n"); 1578 if (isDebugSection(SectionName)) 1579 HasDebugInfo = true; 1580 if (isKSymtabSection(SectionName)) 1581 opts::LinuxKernelMode = true; 1582 } 1583 } 1584 1585 if (HasDebugInfo && !opts::UpdateDebugSections && !opts::AggregateOnly) { 1586 errs() << "BOLT-WARNING: debug info will be stripped from the binary. " 1587 "Use -update-debug-sections to keep it.\n"; 1588 } 1589 1590 HasTextRelocations = (bool)BC->getUniqueSectionByName(".rela.text"); 1591 LSDASection = BC->getUniqueSectionByName(".gcc_except_table"); 1592 EHFrameSection = BC->getUniqueSectionByName(".eh_frame"); 1593 GOTPLTSection = BC->getUniqueSectionByName(".got.plt"); 1594 RelaPLTSection = BC->getUniqueSectionByName(".rela.plt"); 1595 RelaDynSection = BC->getUniqueSectionByName(".rela.dyn"); 1596 BuildIDSection = BC->getUniqueSectionByName(".note.gnu.build-id"); 1597 SDTSection = BC->getUniqueSectionByName(".note.stapsdt"); 1598 PseudoProbeDescSection = BC->getUniqueSectionByName(".pseudo_probe_desc"); 1599 PseudoProbeSection = BC->getUniqueSectionByName(".pseudo_probe"); 1600 1601 if (ErrorOr<BinarySection &> BATSec = 1602 BC->getUniqueSectionByName(BoltAddressTranslation::SECTION_NAME)) { 1603 // Do not read BAT when plotting a heatmap 1604 if (!opts::HeatmapMode) { 1605 if (std::error_code EC = BAT->parse(BATSec->getContents())) { 1606 errs() << "BOLT-ERROR: failed to parse BOLT address translation " 1607 "table.\n"; 1608 exit(1); 1609 } 1610 } 1611 } 1612 1613 if (opts::PrintSections) { 1614 outs() << "BOLT-INFO: Sections from original binary:\n"; 1615 BC->printSections(outs()); 1616 } 1617 1618 if (opts::RelocationMode == cl::BOU_TRUE && !HasTextRelocations) { 1619 errs() << "BOLT-ERROR: relocations against code are missing from the input " 1620 "file. Cannot proceed in relocations mode (-relocs).\n"; 1621 exit(1); 1622 } 1623 1624 BC->HasRelocations = 1625 HasTextRelocations && (opts::RelocationMode != cl::BOU_FALSE); 1626 1627 // Force non-relocation mode for heatmap generation 1628 if (opts::HeatmapMode) 1629 BC->HasRelocations = false; 1630 1631 if (BC->HasRelocations) 1632 outs() << "BOLT-INFO: enabling " << (opts::StrictMode ? "strict " : "") 1633 << "relocation mode\n"; 1634 1635 // Read EH frame for function boundaries info. 1636 Expected<const DWARFDebugFrame *> EHFrameOrError = BC->DwCtx->getEHFrame(); 1637 if (!EHFrameOrError) 1638 report_error("expected valid eh_frame section", EHFrameOrError.takeError()); 1639 CFIRdWrt.reset(new CFIReaderWriter(*EHFrameOrError.get())); 1640 1641 // Parse build-id 1642 parseBuildID(); 1643 if (Optional<std::string> FileBuildID = getPrintableBuildID()) 1644 BC->setFileBuildID(*FileBuildID); 1645 1646 parseSDTNotes(); 1647 1648 // Read .dynamic/PT_DYNAMIC. 1649 return readELFDynamic(); 1650 } 1651 1652 void RewriteInstance::adjustCommandLineOptions() { 1653 if (BC->isAArch64() && !BC->HasRelocations) 1654 errs() << "BOLT-WARNING: non-relocation mode for AArch64 is not fully " 1655 "supported\n"; 1656 1657 if (RuntimeLibrary *RtLibrary = BC->getRuntimeLibrary()) 1658 RtLibrary->adjustCommandLineOptions(*BC); 1659 1660 if (opts::AlignMacroOpFusion != MFT_NONE && !BC->isX86()) { 1661 outs() << "BOLT-INFO: disabling -align-macro-fusion on non-x86 platform\n"; 1662 opts::AlignMacroOpFusion = MFT_NONE; 1663 } 1664 1665 if (BC->isX86() && BC->MAB->allowAutoPadding()) { 1666 if (!BC->HasRelocations) { 1667 errs() << "BOLT-ERROR: cannot apply mitigations for Intel JCC erratum in " 1668 "non-relocation mode\n"; 1669 exit(1); 1670 } 1671 outs() << "BOLT-WARNING: using mitigation for Intel JCC erratum, layout " 1672 "may take several minutes\n"; 1673 opts::AlignMacroOpFusion = MFT_NONE; 1674 } 1675 1676 if (opts::AlignMacroOpFusion != MFT_NONE && !BC->HasRelocations) { 1677 outs() << "BOLT-INFO: disabling -align-macro-fusion in non-relocation " 1678 "mode\n"; 1679 opts::AlignMacroOpFusion = MFT_NONE; 1680 } 1681 1682 if (opts::SplitEH && !BC->HasRelocations) { 1683 errs() << "BOLT-WARNING: disabling -split-eh in non-relocation mode\n"; 1684 opts::SplitEH = false; 1685 } 1686 1687 if (opts::SplitEH && !BC->HasFixedLoadAddress) { 1688 errs() << "BOLT-WARNING: disabling -split-eh for shared object\n"; 1689 opts::SplitEH = false; 1690 } 1691 1692 if (opts::StrictMode && !BC->HasRelocations) { 1693 errs() << "BOLT-WARNING: disabling strict mode (-strict) in non-relocation " 1694 "mode\n"; 1695 opts::StrictMode = false; 1696 } 1697 1698 if (BC->HasRelocations && opts::AggregateOnly && 1699 !opts::StrictMode.getNumOccurrences()) { 1700 outs() << "BOLT-INFO: enabling strict relocation mode for aggregation " 1701 "purposes\n"; 1702 opts::StrictMode = true; 1703 } 1704 1705 if (BC->isX86() && BC->HasRelocations && 1706 opts::AlignMacroOpFusion == MFT_HOT && !ProfileReader) { 1707 outs() << "BOLT-INFO: enabling -align-macro-fusion=all since no profile " 1708 "was specified\n"; 1709 opts::AlignMacroOpFusion = MFT_ALL; 1710 } 1711 1712 if (!BC->HasRelocations && 1713 opts::ReorderFunctions != ReorderFunctions::RT_NONE) { 1714 errs() << "BOLT-ERROR: function reordering only works when " 1715 << "relocations are enabled\n"; 1716 exit(1); 1717 } 1718 1719 if (opts::ReorderFunctions != ReorderFunctions::RT_NONE && 1720 !opts::HotText.getNumOccurrences()) { 1721 opts::HotText = true; 1722 } else if (opts::HotText && !BC->HasRelocations) { 1723 errs() << "BOLT-WARNING: hot text is disabled in non-relocation mode\n"; 1724 opts::HotText = false; 1725 } 1726 1727 if (opts::HotText && opts::HotTextMoveSections.getNumOccurrences() == 0) { 1728 opts::HotTextMoveSections.addValue(".stub"); 1729 opts::HotTextMoveSections.addValue(".mover"); 1730 opts::HotTextMoveSections.addValue(".never_hugify"); 1731 } 1732 1733 if (opts::UseOldText && !BC->OldTextSectionAddress) { 1734 errs() << "BOLT-WARNING: cannot use old .text as the section was not found" 1735 "\n"; 1736 opts::UseOldText = false; 1737 } 1738 if (opts::UseOldText && !BC->HasRelocations) { 1739 errs() << "BOLT-WARNING: cannot use old .text in non-relocation mode\n"; 1740 opts::UseOldText = false; 1741 } 1742 1743 if (!opts::AlignText.getNumOccurrences()) 1744 opts::AlignText = BC->PageAlign; 1745 1746 if (opts::AlignText < opts::AlignFunctions) 1747 opts::AlignText = (unsigned)opts::AlignFunctions; 1748 1749 if (BC->isX86() && opts::Lite.getNumOccurrences() == 0 && !opts::StrictMode && 1750 !opts::UseOldText) 1751 opts::Lite = true; 1752 1753 if (opts::Lite && opts::UseOldText) { 1754 errs() << "BOLT-WARNING: cannot combine -lite with -use-old-text. " 1755 "Disabling -use-old-text.\n"; 1756 opts::UseOldText = false; 1757 } 1758 1759 if (opts::Lite && opts::StrictMode) { 1760 errs() << "BOLT-ERROR: -strict and -lite cannot be used at the same time\n"; 1761 exit(1); 1762 } 1763 1764 if (opts::Lite) 1765 outs() << "BOLT-INFO: enabling lite mode\n"; 1766 1767 if (!opts::SaveProfile.empty() && BAT->enabledFor(InputFile)) { 1768 errs() << "BOLT-ERROR: unable to save profile in YAML format for input " 1769 "file processed by BOLT. Please remove -w option and use branch " 1770 "profile.\n"; 1771 exit(1); 1772 } 1773 } 1774 1775 namespace { 1776 template <typename ELFT> 1777 int64_t getRelocationAddend(const ELFObjectFile<ELFT> *Obj, 1778 const RelocationRef &RelRef) { 1779 using ELFShdrTy = typename ELFT::Shdr; 1780 using Elf_Rela = typename ELFT::Rela; 1781 int64_t Addend = 0; 1782 const ELFFile<ELFT> &EF = Obj->getELFFile(); 1783 DataRefImpl Rel = RelRef.getRawDataRefImpl(); 1784 const ELFShdrTy *RelocationSection = cantFail(EF.getSection(Rel.d.a)); 1785 switch (RelocationSection->sh_type) { 1786 default: 1787 llvm_unreachable("unexpected relocation section type"); 1788 case ELF::SHT_REL: 1789 break; 1790 case ELF::SHT_RELA: { 1791 const Elf_Rela *RelA = Obj->getRela(Rel); 1792 Addend = RelA->r_addend; 1793 break; 1794 } 1795 } 1796 1797 return Addend; 1798 } 1799 1800 int64_t getRelocationAddend(const ELFObjectFileBase *Obj, 1801 const RelocationRef &Rel) { 1802 if (auto *ELF32LE = dyn_cast<ELF32LEObjectFile>(Obj)) 1803 return getRelocationAddend(ELF32LE, Rel); 1804 if (auto *ELF64LE = dyn_cast<ELF64LEObjectFile>(Obj)) 1805 return getRelocationAddend(ELF64LE, Rel); 1806 if (auto *ELF32BE = dyn_cast<ELF32BEObjectFile>(Obj)) 1807 return getRelocationAddend(ELF32BE, Rel); 1808 auto *ELF64BE = cast<ELF64BEObjectFile>(Obj); 1809 return getRelocationAddend(ELF64BE, Rel); 1810 } 1811 1812 template <typename ELFT> 1813 uint32_t getRelocationSymbol(const ELFObjectFile<ELFT> *Obj, 1814 const RelocationRef &RelRef) { 1815 using ELFShdrTy = typename ELFT::Shdr; 1816 uint32_t Symbol = 0; 1817 const ELFFile<ELFT> &EF = Obj->getELFFile(); 1818 DataRefImpl Rel = RelRef.getRawDataRefImpl(); 1819 const ELFShdrTy *RelocationSection = cantFail(EF.getSection(Rel.d.a)); 1820 switch (RelocationSection->sh_type) { 1821 default: 1822 llvm_unreachable("unexpected relocation section type"); 1823 case ELF::SHT_REL: 1824 Symbol = Obj->getRel(Rel)->getSymbol(EF.isMips64EL()); 1825 break; 1826 case ELF::SHT_RELA: 1827 Symbol = Obj->getRela(Rel)->getSymbol(EF.isMips64EL()); 1828 break; 1829 } 1830 1831 return Symbol; 1832 } 1833 1834 uint32_t getRelocationSymbol(const ELFObjectFileBase *Obj, 1835 const RelocationRef &Rel) { 1836 if (auto *ELF32LE = dyn_cast<ELF32LEObjectFile>(Obj)) 1837 return getRelocationSymbol(ELF32LE, Rel); 1838 if (auto *ELF64LE = dyn_cast<ELF64LEObjectFile>(Obj)) 1839 return getRelocationSymbol(ELF64LE, Rel); 1840 if (auto *ELF32BE = dyn_cast<ELF32BEObjectFile>(Obj)) 1841 return getRelocationSymbol(ELF32BE, Rel); 1842 auto *ELF64BE = cast<ELF64BEObjectFile>(Obj); 1843 return getRelocationSymbol(ELF64BE, Rel); 1844 } 1845 } // anonymous namespace 1846 1847 bool RewriteInstance::analyzeRelocation( 1848 const RelocationRef &Rel, uint64_t RType, std::string &SymbolName, 1849 bool &IsSectionRelocation, uint64_t &SymbolAddress, int64_t &Addend, 1850 uint64_t &ExtractedValue, bool &Skip) const { 1851 Skip = false; 1852 if (!Relocation::isSupported(RType)) 1853 return false; 1854 1855 const bool IsAArch64 = BC->isAArch64(); 1856 1857 const size_t RelSize = Relocation::getSizeForType(RType); 1858 1859 ErrorOr<uint64_t> Value = 1860 BC->getUnsignedValueAtAddress(Rel.getOffset(), RelSize); 1861 assert(Value && "failed to extract relocated value"); 1862 if ((Skip = Relocation::skipRelocationProcess(RType, *Value))) 1863 return true; 1864 1865 ExtractedValue = Relocation::extractValue(RType, *Value, Rel.getOffset()); 1866 Addend = getRelocationAddend(InputFile, Rel); 1867 1868 const bool IsPCRelative = Relocation::isPCRelative(RType); 1869 const uint64_t PCRelOffset = IsPCRelative && !IsAArch64 ? Rel.getOffset() : 0; 1870 bool SkipVerification = false; 1871 auto SymbolIter = Rel.getSymbol(); 1872 if (SymbolIter == InputFile->symbol_end()) { 1873 SymbolAddress = ExtractedValue - Addend + PCRelOffset; 1874 MCSymbol *RelSymbol = 1875 BC->getOrCreateGlobalSymbol(SymbolAddress, "RELSYMat"); 1876 SymbolName = std::string(RelSymbol->getName()); 1877 IsSectionRelocation = false; 1878 } else { 1879 const SymbolRef &Symbol = *SymbolIter; 1880 SymbolName = std::string(cantFail(Symbol.getName())); 1881 SymbolAddress = cantFail(Symbol.getAddress()); 1882 SkipVerification = (cantFail(Symbol.getType()) == SymbolRef::ST_Other); 1883 // Section symbols are marked as ST_Debug. 1884 IsSectionRelocation = (cantFail(Symbol.getType()) == SymbolRef::ST_Debug); 1885 // Check for PLT entry registered with symbol name 1886 if (!SymbolAddress && IsAArch64) { 1887 const BinaryData *BD = BC->getPLTBinaryDataByName(SymbolName); 1888 SymbolAddress = BD ? BD->getAddress() : 0; 1889 } 1890 } 1891 // For PIE or dynamic libs, the linker may choose not to put the relocation 1892 // result at the address if it is a X86_64_64 one because it will emit a 1893 // dynamic relocation (X86_RELATIVE) for the dynamic linker and loader to 1894 // resolve it at run time. The static relocation result goes as the addend 1895 // of the dynamic relocation in this case. We can't verify these cases. 1896 // FIXME: perhaps we can try to find if it really emitted a corresponding 1897 // RELATIVE relocation at this offset with the correct value as the addend. 1898 if (!BC->HasFixedLoadAddress && RelSize == 8) 1899 SkipVerification = true; 1900 1901 if (IsSectionRelocation && !IsAArch64) { 1902 ErrorOr<BinarySection &> Section = BC->getSectionForAddress(SymbolAddress); 1903 assert(Section && "section expected for section relocation"); 1904 SymbolName = "section " + std::string(Section->getName()); 1905 // Convert section symbol relocations to regular relocations inside 1906 // non-section symbols. 1907 if (Section->containsAddress(ExtractedValue) && !IsPCRelative) { 1908 SymbolAddress = ExtractedValue; 1909 Addend = 0; 1910 } else { 1911 Addend = ExtractedValue - (SymbolAddress - PCRelOffset); 1912 } 1913 } 1914 1915 // If no symbol has been found or if it is a relocation requiring the 1916 // creation of a GOT entry, do not link against the symbol but against 1917 // whatever address was extracted from the instruction itself. We are 1918 // not creating a GOT entry as this was already processed by the linker. 1919 // For GOT relocs, do not subtract addend as the addend does not refer 1920 // to this instruction's target, but it refers to the target in the GOT 1921 // entry. 1922 if (Relocation::isGOT(RType)) { 1923 Addend = 0; 1924 SymbolAddress = ExtractedValue + PCRelOffset; 1925 } else if (Relocation::isTLS(RType)) { 1926 SkipVerification = true; 1927 } else if (!SymbolAddress) { 1928 assert(!IsSectionRelocation); 1929 if (ExtractedValue || Addend == 0 || IsPCRelative) { 1930 SymbolAddress = 1931 truncateToSize(ExtractedValue - Addend + PCRelOffset, RelSize); 1932 } else { 1933 // This is weird case. The extracted value is zero but the addend is 1934 // non-zero and the relocation is not pc-rel. Using the previous logic, 1935 // the SymbolAddress would end up as a huge number. Seen in 1936 // exceptions_pic.test. 1937 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: relocation @ 0x" 1938 << Twine::utohexstr(Rel.getOffset()) 1939 << " value does not match addend for " 1940 << "relocation to undefined symbol.\n"); 1941 return true; 1942 } 1943 } 1944 1945 auto verifyExtractedValue = [&]() { 1946 if (SkipVerification) 1947 return true; 1948 1949 if (IsAArch64) 1950 return true; 1951 1952 if (SymbolName == "__hot_start" || SymbolName == "__hot_end") 1953 return true; 1954 1955 if (RType == ELF::R_X86_64_PLT32) 1956 return true; 1957 1958 return truncateToSize(ExtractedValue, RelSize) == 1959 truncateToSize(SymbolAddress + Addend - PCRelOffset, RelSize); 1960 }; 1961 1962 (void)verifyExtractedValue; 1963 assert(verifyExtractedValue() && "mismatched extracted relocation value"); 1964 1965 return true; 1966 } 1967 1968 void RewriteInstance::processDynamicRelocations() { 1969 // Read relocations for PLT - DT_JMPREL. 1970 if (PLTRelocationsSize > 0) { 1971 ErrorOr<BinarySection &> PLTRelSectionOrErr = 1972 BC->getSectionForAddress(*PLTRelocationsAddress); 1973 if (!PLTRelSectionOrErr) 1974 report_error("unable to find section corresponding to DT_JMPREL", 1975 PLTRelSectionOrErr.getError()); 1976 if (PLTRelSectionOrErr->getSize() != PLTRelocationsSize) 1977 report_error("section size mismatch for DT_PLTRELSZ", 1978 errc::executable_format_error); 1979 readDynamicRelocations(PLTRelSectionOrErr->getSectionRef(), 1980 /*IsJmpRel*/ true); 1981 } 1982 1983 // The rest of dynamic relocations - DT_RELA. 1984 if (DynamicRelocationsSize > 0) { 1985 ErrorOr<BinarySection &> DynamicRelSectionOrErr = 1986 BC->getSectionForAddress(*DynamicRelocationsAddress); 1987 if (!DynamicRelSectionOrErr) 1988 report_error("unable to find section corresponding to DT_RELA", 1989 DynamicRelSectionOrErr.getError()); 1990 if (DynamicRelSectionOrErr->getSize() != DynamicRelocationsSize) 1991 report_error("section size mismatch for DT_RELASZ", 1992 errc::executable_format_error); 1993 readDynamicRelocations(DynamicRelSectionOrErr->getSectionRef(), 1994 /*IsJmpRel*/ false); 1995 } 1996 } 1997 1998 void RewriteInstance::processRelocations() { 1999 if (!BC->HasRelocations) 2000 return; 2001 2002 for (const SectionRef &Section : InputFile->sections()) { 2003 if (cantFail(Section.getRelocatedSection()) != InputFile->section_end() && 2004 !BinarySection(*BC, Section).isAllocatable()) 2005 readRelocations(Section); 2006 } 2007 2008 if (NumFailedRelocations) 2009 errs() << "BOLT-WARNING: Failed to analyze " << NumFailedRelocations 2010 << " relocations\n"; 2011 } 2012 2013 void RewriteInstance::insertLKMarker(uint64_t PC, uint64_t SectionOffset, 2014 int32_t PCRelativeOffset, 2015 bool IsPCRelative, StringRef SectionName) { 2016 BC->LKMarkers[PC].emplace_back(LKInstructionMarkerInfo{ 2017 SectionOffset, PCRelativeOffset, IsPCRelative, SectionName}); 2018 } 2019 2020 void RewriteInstance::processLKSections() { 2021 assert(opts::LinuxKernelMode && 2022 "process Linux Kernel special sections and their relocations only in " 2023 "linux kernel mode.\n"); 2024 2025 processLKExTable(); 2026 processLKPCIFixup(); 2027 processLKKSymtab(); 2028 processLKKSymtab(true); 2029 processLKBugTable(); 2030 processLKSMPLocks(); 2031 } 2032 2033 /// Process __ex_table section of Linux Kernel. 2034 /// This section contains information regarding kernel level exception 2035 /// handling (https://www.kernel.org/doc/html/latest/x86/exception-tables.html). 2036 /// More documentation is in arch/x86/include/asm/extable.h. 2037 /// 2038 /// The section is the list of the following structures: 2039 /// 2040 /// struct exception_table_entry { 2041 /// int insn; 2042 /// int fixup; 2043 /// int handler; 2044 /// }; 2045 /// 2046 void RewriteInstance::processLKExTable() { 2047 ErrorOr<BinarySection &> SectionOrError = 2048 BC->getUniqueSectionByName("__ex_table"); 2049 if (!SectionOrError) 2050 return; 2051 2052 const uint64_t SectionSize = SectionOrError->getSize(); 2053 const uint64_t SectionAddress = SectionOrError->getAddress(); 2054 assert((SectionSize % 12) == 0 && 2055 "The size of the __ex_table section should be a multiple of 12"); 2056 for (uint64_t I = 0; I < SectionSize; I += 4) { 2057 const uint64_t EntryAddress = SectionAddress + I; 2058 ErrorOr<uint64_t> Offset = BC->getSignedValueAtAddress(EntryAddress, 4); 2059 assert(Offset && "failed reading PC-relative offset for __ex_table"); 2060 int32_t SignedOffset = *Offset; 2061 const uint64_t RefAddress = EntryAddress + SignedOffset; 2062 2063 BinaryFunction *ContainingBF = 2064 BC->getBinaryFunctionContainingAddress(RefAddress); 2065 if (!ContainingBF) 2066 continue; 2067 2068 MCSymbol *ReferencedSymbol = ContainingBF->getSymbol(); 2069 const uint64_t FunctionOffset = RefAddress - ContainingBF->getAddress(); 2070 switch (I % 12) { 2071 default: 2072 llvm_unreachable("bad alignment of __ex_table"); 2073 break; 2074 case 0: 2075 // insn 2076 insertLKMarker(RefAddress, I, SignedOffset, true, "__ex_table"); 2077 break; 2078 case 4: 2079 // fixup 2080 if (FunctionOffset) 2081 ReferencedSymbol = ContainingBF->addEntryPointAtOffset(FunctionOffset); 2082 BC->addRelocation(EntryAddress, ReferencedSymbol, Relocation::getPC32(), 2083 0, *Offset); 2084 break; 2085 case 8: 2086 // handler 2087 assert(!FunctionOffset && 2088 "__ex_table handler entry should point to function start"); 2089 BC->addRelocation(EntryAddress, ReferencedSymbol, Relocation::getPC32(), 2090 0, *Offset); 2091 break; 2092 } 2093 } 2094 } 2095 2096 /// Process .pci_fixup section of Linux Kernel. 2097 /// This section contains a list of entries for different PCI devices and their 2098 /// corresponding hook handler (code pointer where the fixup 2099 /// code resides, usually on x86_64 it is an entry PC relative 32 bit offset). 2100 /// Documentation is in include/linux/pci.h. 2101 void RewriteInstance::processLKPCIFixup() { 2102 ErrorOr<BinarySection &> SectionOrError = 2103 BC->getUniqueSectionByName(".pci_fixup"); 2104 assert(SectionOrError && 2105 ".pci_fixup section not found in Linux Kernel binary"); 2106 const uint64_t SectionSize = SectionOrError->getSize(); 2107 const uint64_t SectionAddress = SectionOrError->getAddress(); 2108 assert((SectionSize % 16) == 0 && ".pci_fixup size is not a multiple of 16"); 2109 2110 for (uint64_t I = 12; I + 4 <= SectionSize; I += 16) { 2111 const uint64_t PC = SectionAddress + I; 2112 ErrorOr<uint64_t> Offset = BC->getSignedValueAtAddress(PC, 4); 2113 assert(Offset && "cannot read value from .pci_fixup"); 2114 const int32_t SignedOffset = *Offset; 2115 const uint64_t HookupAddress = PC + SignedOffset; 2116 BinaryFunction *HookupFunction = 2117 BC->getBinaryFunctionAtAddress(HookupAddress); 2118 assert(HookupFunction && "expected function for entry in .pci_fixup"); 2119 BC->addRelocation(PC, HookupFunction->getSymbol(), Relocation::getPC32(), 0, 2120 *Offset); 2121 } 2122 } 2123 2124 /// Process __ksymtab[_gpl] sections of Linux Kernel. 2125 /// This section lists all the vmlinux symbols that kernel modules can access. 2126 /// 2127 /// All the entries are 4 bytes each and hence we can read them by one by one 2128 /// and ignore the ones that are not pointing to the .text section. All pointers 2129 /// are PC relative offsets. Always, points to the beginning of the function. 2130 void RewriteInstance::processLKKSymtab(bool IsGPL) { 2131 StringRef SectionName = "__ksymtab"; 2132 if (IsGPL) 2133 SectionName = "__ksymtab_gpl"; 2134 ErrorOr<BinarySection &> SectionOrError = 2135 BC->getUniqueSectionByName(SectionName); 2136 assert(SectionOrError && 2137 "__ksymtab[_gpl] section not found in Linux Kernel binary"); 2138 const uint64_t SectionSize = SectionOrError->getSize(); 2139 const uint64_t SectionAddress = SectionOrError->getAddress(); 2140 assert((SectionSize % 4) == 0 && 2141 "The size of the __ksymtab[_gpl] section should be a multiple of 4"); 2142 2143 for (uint64_t I = 0; I < SectionSize; I += 4) { 2144 const uint64_t EntryAddress = SectionAddress + I; 2145 ErrorOr<uint64_t> Offset = BC->getSignedValueAtAddress(EntryAddress, 4); 2146 assert(Offset && "Reading valid PC-relative offset for a ksymtab entry"); 2147 const int32_t SignedOffset = *Offset; 2148 const uint64_t RefAddress = EntryAddress + SignedOffset; 2149 BinaryFunction *BF = BC->getBinaryFunctionAtAddress(RefAddress); 2150 if (!BF) 2151 continue; 2152 2153 BC->addRelocation(EntryAddress, BF->getSymbol(), Relocation::getPC32(), 0, 2154 *Offset); 2155 } 2156 } 2157 2158 /// Process __bug_table section. 2159 /// This section contains information useful for kernel debugging. 2160 /// Each entry in the section is a struct bug_entry that contains a pointer to 2161 /// the ud2 instruction corresponding to the bug, corresponding file name (both 2162 /// pointers use PC relative offset addressing), line number, and flags. 2163 /// The definition of the struct bug_entry can be found in 2164 /// `include/asm-generic/bug.h` 2165 void RewriteInstance::processLKBugTable() { 2166 ErrorOr<BinarySection &> SectionOrError = 2167 BC->getUniqueSectionByName("__bug_table"); 2168 if (!SectionOrError) 2169 return; 2170 2171 const uint64_t SectionSize = SectionOrError->getSize(); 2172 const uint64_t SectionAddress = SectionOrError->getAddress(); 2173 assert((SectionSize % 12) == 0 && 2174 "The size of the __bug_table section should be a multiple of 12"); 2175 for (uint64_t I = 0; I < SectionSize; I += 12) { 2176 const uint64_t EntryAddress = SectionAddress + I; 2177 ErrorOr<uint64_t> Offset = BC->getSignedValueAtAddress(EntryAddress, 4); 2178 assert(Offset && 2179 "Reading valid PC-relative offset for a __bug_table entry"); 2180 const int32_t SignedOffset = *Offset; 2181 const uint64_t RefAddress = EntryAddress + SignedOffset; 2182 assert(BC->getBinaryFunctionContainingAddress(RefAddress) && 2183 "__bug_table entries should point to a function"); 2184 2185 insertLKMarker(RefAddress, I, SignedOffset, true, "__bug_table"); 2186 } 2187 } 2188 2189 /// .smp_locks section contains PC-relative references to instructions with LOCK 2190 /// prefix. The prefix can be converted to NOP at boot time on non-SMP systems. 2191 void RewriteInstance::processLKSMPLocks() { 2192 ErrorOr<BinarySection &> SectionOrError = 2193 BC->getUniqueSectionByName(".smp_locks"); 2194 if (!SectionOrError) 2195 return; 2196 2197 uint64_t SectionSize = SectionOrError->getSize(); 2198 const uint64_t SectionAddress = SectionOrError->getAddress(); 2199 assert((SectionSize % 4) == 0 && 2200 "The size of the .smp_locks section should be a multiple of 4"); 2201 2202 for (uint64_t I = 0; I < SectionSize; I += 4) { 2203 const uint64_t EntryAddress = SectionAddress + I; 2204 ErrorOr<uint64_t> Offset = BC->getSignedValueAtAddress(EntryAddress, 4); 2205 assert(Offset && "Reading valid PC-relative offset for a .smp_locks entry"); 2206 int32_t SignedOffset = *Offset; 2207 uint64_t RefAddress = EntryAddress + SignedOffset; 2208 2209 BinaryFunction *ContainingBF = 2210 BC->getBinaryFunctionContainingAddress(RefAddress); 2211 if (!ContainingBF) 2212 continue; 2213 2214 insertLKMarker(RefAddress, I, SignedOffset, true, ".smp_locks"); 2215 } 2216 } 2217 2218 void RewriteInstance::readDynamicRelocations(const SectionRef &Section, 2219 bool IsJmpRel) { 2220 assert(BinarySection(*BC, Section).isAllocatable() && "allocatable expected"); 2221 2222 LLVM_DEBUG({ 2223 StringRef SectionName = cantFail(Section.getName()); 2224 dbgs() << "BOLT-DEBUG: reading relocations for section " << SectionName 2225 << ":\n"; 2226 }); 2227 2228 for (const RelocationRef &Rel : Section.relocations()) { 2229 const uint64_t RType = Rel.getType(); 2230 if (Relocation::isNone(RType)) 2231 continue; 2232 2233 StringRef SymbolName = "<none>"; 2234 MCSymbol *Symbol = nullptr; 2235 uint64_t SymbolAddress = 0; 2236 const uint64_t Addend = getRelocationAddend(InputFile, Rel); 2237 2238 symbol_iterator SymbolIter = Rel.getSymbol(); 2239 if (SymbolIter != InputFile->symbol_end()) { 2240 SymbolName = cantFail(SymbolIter->getName()); 2241 BinaryData *BD = BC->getBinaryDataByName(SymbolName); 2242 Symbol = BD ? BD->getSymbol() 2243 : BC->getOrCreateUndefinedGlobalSymbol(SymbolName); 2244 SymbolAddress = cantFail(SymbolIter->getAddress()); 2245 (void)SymbolAddress; 2246 } 2247 2248 LLVM_DEBUG( 2249 SmallString<16> TypeName; 2250 Rel.getTypeName(TypeName); 2251 dbgs() << "BOLT-DEBUG: dynamic relocation at 0x" 2252 << Twine::utohexstr(Rel.getOffset()) << " : " << TypeName 2253 << " : " << SymbolName << " : " << Twine::utohexstr(SymbolAddress) 2254 << " : + 0x" << Twine::utohexstr(Addend) << '\n' 2255 ); 2256 2257 if (IsJmpRel) 2258 IsJmpRelocation[RType] = true; 2259 2260 if (Symbol) 2261 SymbolIndex[Symbol] = getRelocationSymbol(InputFile, Rel); 2262 2263 BC->addDynamicRelocation(Rel.getOffset(), Symbol, RType, Addend); 2264 } 2265 } 2266 2267 void RewriteInstance::readRelocations(const SectionRef &Section) { 2268 LLVM_DEBUG({ 2269 StringRef SectionName = cantFail(Section.getName()); 2270 dbgs() << "BOLT-DEBUG: reading relocations for section " << SectionName 2271 << ":\n"; 2272 }); 2273 if (BinarySection(*BC, Section).isAllocatable()) { 2274 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: ignoring runtime relocations\n"); 2275 return; 2276 } 2277 section_iterator SecIter = cantFail(Section.getRelocatedSection()); 2278 assert(SecIter != InputFile->section_end() && "relocated section expected"); 2279 SectionRef RelocatedSection = *SecIter; 2280 2281 StringRef RelocatedSectionName = cantFail(RelocatedSection.getName()); 2282 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: relocated section is " 2283 << RelocatedSectionName << '\n'); 2284 2285 if (!BinarySection(*BC, RelocatedSection).isAllocatable()) { 2286 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: ignoring relocations against " 2287 << "non-allocatable section\n"); 2288 return; 2289 } 2290 const bool SkipRelocs = StringSwitch<bool>(RelocatedSectionName) 2291 .Cases(".plt", ".rela.plt", ".got.plt", 2292 ".eh_frame", ".gcc_except_table", true) 2293 .Default(false); 2294 if (SkipRelocs) { 2295 LLVM_DEBUG( 2296 dbgs() << "BOLT-DEBUG: ignoring relocations against known section\n"); 2297 return; 2298 } 2299 2300 const bool IsAArch64 = BC->isAArch64(); 2301 const bool IsFromCode = RelocatedSection.isText(); 2302 2303 auto printRelocationInfo = [&](const RelocationRef &Rel, 2304 StringRef SymbolName, 2305 uint64_t SymbolAddress, 2306 uint64_t Addend, 2307 uint64_t ExtractedValue) { 2308 SmallString<16> TypeName; 2309 Rel.getTypeName(TypeName); 2310 const uint64_t Address = SymbolAddress + Addend; 2311 ErrorOr<BinarySection &> Section = BC->getSectionForAddress(SymbolAddress); 2312 dbgs() << "Relocation: offset = 0x" 2313 << Twine::utohexstr(Rel.getOffset()) 2314 << "; type = " << TypeName 2315 << "; value = 0x" << Twine::utohexstr(ExtractedValue) 2316 << "; symbol = " << SymbolName 2317 << " (" << (Section ? Section->getName() : "") << ")" 2318 << "; symbol address = 0x" << Twine::utohexstr(SymbolAddress) 2319 << "; addend = 0x" << Twine::utohexstr(Addend) 2320 << "; address = 0x" << Twine::utohexstr(Address) 2321 << "; in = "; 2322 if (BinaryFunction *Func = BC->getBinaryFunctionContainingAddress( 2323 Rel.getOffset(), false, IsAArch64)) 2324 dbgs() << Func->getPrintName() << "\n"; 2325 else 2326 dbgs() << BC->getSectionForAddress(Rel.getOffset())->getName() << "\n"; 2327 }; 2328 2329 for (const RelocationRef &Rel : Section.relocations()) { 2330 SmallString<16> TypeName; 2331 Rel.getTypeName(TypeName); 2332 uint64_t RType = Rel.getType(); 2333 if (Relocation::isNone(RType)) 2334 continue; 2335 2336 // Adjust the relocation type as the linker might have skewed it. 2337 if (BC->isX86() && (RType & ELF::R_X86_64_converted_reloc_bit)) { 2338 if (opts::Verbosity >= 1) 2339 dbgs() << "BOLT-WARNING: ignoring R_X86_64_converted_reloc_bit\n"; 2340 RType &= ~ELF::R_X86_64_converted_reloc_bit; 2341 } 2342 2343 if (Relocation::isTLS(RType)) { 2344 // No special handling required for TLS relocations on X86. 2345 if (BC->isX86()) 2346 continue; 2347 2348 // The non-got related TLS relocations on AArch64 also could be skipped. 2349 if (!Relocation::isGOT(RType)) 2350 continue; 2351 } 2352 2353 if (!IsAArch64 && BC->getDynamicRelocationAt(Rel.getOffset())) { 2354 LLVM_DEBUG( 2355 dbgs() << "BOLT-DEBUG: address 0x" 2356 << Twine::utohexstr(Rel.getOffset()) 2357 << " has a dynamic relocation against it. Ignoring static " 2358 "relocation.\n"); 2359 continue; 2360 } 2361 2362 std::string SymbolName; 2363 uint64_t SymbolAddress; 2364 int64_t Addend; 2365 uint64_t ExtractedValue; 2366 bool IsSectionRelocation; 2367 bool Skip; 2368 if (!analyzeRelocation(Rel, RType, SymbolName, IsSectionRelocation, 2369 SymbolAddress, Addend, ExtractedValue, Skip)) { 2370 LLVM_DEBUG(dbgs() << "BOLT-WARNING: failed to analyze relocation @ " 2371 << "offset = 0x" << Twine::utohexstr(Rel.getOffset()) 2372 << "; type name = " << TypeName << '\n'); 2373 ++NumFailedRelocations; 2374 continue; 2375 } 2376 2377 if (Skip) { 2378 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: skipping relocation @ offset = 0x" 2379 << Twine::utohexstr(Rel.getOffset()) 2380 << "; type name = " << TypeName << '\n'); 2381 continue; 2382 } 2383 2384 const uint64_t Address = SymbolAddress + Addend; 2385 2386 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: "; printRelocationInfo( 2387 Rel, SymbolName, SymbolAddress, Addend, ExtractedValue)); 2388 2389 BinaryFunction *ContainingBF = nullptr; 2390 if (IsFromCode) { 2391 ContainingBF = 2392 BC->getBinaryFunctionContainingAddress(Rel.getOffset(), 2393 /*CheckPastEnd*/ false, 2394 /*UseMaxSize*/ true); 2395 assert(ContainingBF && "cannot find function for address in code"); 2396 if (!IsAArch64 && !ContainingBF->containsAddress(Rel.getOffset())) { 2397 if (opts::Verbosity >= 1) 2398 outs() << "BOLT-INFO: " << *ContainingBF 2399 << " has relocations in padding area\n"; 2400 ContainingBF->setSize(ContainingBF->getMaxSize()); 2401 ContainingBF->setSimple(false); 2402 continue; 2403 } 2404 } 2405 2406 MCSymbol *ReferencedSymbol = nullptr; 2407 if (!IsSectionRelocation) { 2408 if (BinaryData *BD = BC->getBinaryDataByName(SymbolName)) 2409 ReferencedSymbol = BD->getSymbol(); 2410 } 2411 2412 // PC-relative relocations from data to code are tricky since the original 2413 // information is typically lost after linking even with '--emit-relocs'. 2414 // They are normally used by PIC-style jump tables and reference both 2415 // the jump table and jump destination by computing the difference 2416 // between the two. If we blindly apply the relocation it will appear 2417 // that it references an arbitrary location in the code, possibly even 2418 // in a different function from that containing the jump table. 2419 if (!IsAArch64 && Relocation::isPCRelative(RType)) { 2420 // For relocations against non-code sections, just register the fact that 2421 // we have a PC-relative relocation at a given address. The actual 2422 // referenced label/address cannot be determined from linker data alone. 2423 if (!IsFromCode) 2424 BC->addPCRelativeDataRelocation(Rel.getOffset()); 2425 else if (!IsSectionRelocation && ReferencedSymbol) 2426 ContainingBF->addRelocation(Rel.getOffset(), ReferencedSymbol, RType, 2427 Addend, ExtractedValue); 2428 else 2429 LLVM_DEBUG( 2430 dbgs() << "BOLT-DEBUG: not creating PC-relative relocation at 0x" 2431 << Twine::utohexstr(Rel.getOffset()) << " for " << SymbolName 2432 << "\n"); 2433 continue; 2434 } 2435 2436 bool ForceRelocation = BC->forceSymbolRelocations(SymbolName); 2437 ErrorOr<BinarySection &> RefSection = 2438 std::make_error_code(std::errc::bad_address); 2439 if (BC->isAArch64() && Relocation::isGOT(RType)) { 2440 ForceRelocation = true; 2441 } else { 2442 RefSection = BC->getSectionForAddress(SymbolAddress); 2443 if (!RefSection && !ForceRelocation) { 2444 LLVM_DEBUG( 2445 dbgs() << "BOLT-DEBUG: cannot determine referenced section.\n"); 2446 continue; 2447 } 2448 } 2449 2450 const bool IsToCode = RefSection && RefSection->isText(); 2451 2452 // Occasionally we may see a reference past the last byte of the function 2453 // typically as a result of __builtin_unreachable(). Check it here. 2454 BinaryFunction *ReferencedBF = BC->getBinaryFunctionContainingAddress( 2455 Address, /*CheckPastEnd*/ true, /*UseMaxSize*/ IsAArch64); 2456 2457 if (!IsSectionRelocation) { 2458 if (BinaryFunction *BF = 2459 BC->getBinaryFunctionContainingAddress(SymbolAddress)) { 2460 if (BF != ReferencedBF) { 2461 // It's possible we are referencing a function without referencing any 2462 // code, e.g. when taking a bitmask action on a function address. 2463 errs() << "BOLT-WARNING: non-standard function reference (e.g. " 2464 "bitmask) detected against function " 2465 << *BF; 2466 if (IsFromCode) 2467 errs() << " from function " << *ContainingBF << '\n'; 2468 else 2469 errs() << " from data section at 0x" 2470 << Twine::utohexstr(Rel.getOffset()) << '\n'; 2471 LLVM_DEBUG(printRelocationInfo(Rel, SymbolName, SymbolAddress, Addend, 2472 ExtractedValue)); 2473 ReferencedBF = BF; 2474 } 2475 } 2476 } else if (ReferencedBF) { 2477 assert(RefSection && "section expected for section relocation"); 2478 if (*ReferencedBF->getOriginSection() != *RefSection) { 2479 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: ignoring false function reference\n"); 2480 ReferencedBF = nullptr; 2481 } 2482 } 2483 2484 // Workaround for a member function pointer de-virtualization bug. We check 2485 // if a non-pc-relative relocation in the code is pointing to (fptr - 1). 2486 if (IsToCode && ContainingBF && !Relocation::isPCRelative(RType) && 2487 (!ReferencedBF || (ReferencedBF->getAddress() != Address))) { 2488 if (const BinaryFunction *RogueBF = 2489 BC->getBinaryFunctionAtAddress(Address + 1)) { 2490 // Do an extra check that the function was referenced previously. 2491 // It's a linear search, but it should rarely happen. 2492 bool Found = false; 2493 for (const auto &RelKV : ContainingBF->Relocations) { 2494 const Relocation &Rel = RelKV.second; 2495 if (Rel.Symbol == RogueBF->getSymbol() && 2496 !Relocation::isPCRelative(Rel.Type)) { 2497 Found = true; 2498 break; 2499 } 2500 } 2501 2502 if (Found) { 2503 errs() << "BOLT-WARNING: detected possible compiler " 2504 "de-virtualization bug: -1 addend used with " 2505 "non-pc-relative relocation against function " 2506 << *RogueBF << " in function " << *ContainingBF << '\n'; 2507 continue; 2508 } 2509 } 2510 } 2511 2512 if (ForceRelocation) { 2513 std::string Name = Relocation::isGOT(RType) ? "Zero" : SymbolName; 2514 ReferencedSymbol = BC->registerNameAtAddress(Name, 0, 0, 0); 2515 SymbolAddress = 0; 2516 if (Relocation::isGOT(RType)) 2517 Addend = Address; 2518 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: forcing relocation against symbol " 2519 << SymbolName << " with addend " << Addend << '\n'); 2520 } else if (ReferencedBF) { 2521 ReferencedSymbol = ReferencedBF->getSymbol(); 2522 uint64_t RefFunctionOffset = 0; 2523 2524 // Adjust the point of reference to a code location inside a function. 2525 if (ReferencedBF->containsAddress(Address, /*UseMaxSize = */true)) { 2526 RefFunctionOffset = Address - ReferencedBF->getAddress(); 2527 if (RefFunctionOffset) { 2528 if (ContainingBF && ContainingBF != ReferencedBF) { 2529 ReferencedSymbol = 2530 ReferencedBF->addEntryPointAtOffset(RefFunctionOffset); 2531 } else { 2532 ReferencedSymbol = 2533 ReferencedBF->getOrCreateLocalLabel(Address, 2534 /*CreatePastEnd =*/true); 2535 ReferencedBF->registerReferencedOffset(RefFunctionOffset); 2536 } 2537 if (opts::Verbosity > 1 && 2538 !BinarySection(*BC, RelocatedSection).isReadOnly()) 2539 errs() << "BOLT-WARNING: writable reference into the middle of " 2540 << "the function " << *ReferencedBF 2541 << " detected at address 0x" 2542 << Twine::utohexstr(Rel.getOffset()) << '\n'; 2543 } 2544 SymbolAddress = Address; 2545 Addend = 0; 2546 } 2547 LLVM_DEBUG( 2548 dbgs() << " referenced function " << *ReferencedBF; 2549 if (Address != ReferencedBF->getAddress()) 2550 dbgs() << " at offset 0x" << Twine::utohexstr(RefFunctionOffset); 2551 dbgs() << '\n' 2552 ); 2553 } else { 2554 if (IsToCode && SymbolAddress) { 2555 // This can happen e.g. with PIC-style jump tables. 2556 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: no corresponding function for " 2557 "relocation against code\n"); 2558 } 2559 2560 // In AArch64 there are zero reasons to keep a reference to the 2561 // "original" symbol plus addend. The original symbol is probably just a 2562 // section symbol. If we are here, this means we are probably accessing 2563 // data, so it is imperative to keep the original address. 2564 if (IsAArch64) { 2565 SymbolName = ("SYMBOLat0x" + Twine::utohexstr(Address)).str(); 2566 SymbolAddress = Address; 2567 Addend = 0; 2568 } 2569 2570 if (BinaryData *BD = BC->getBinaryDataContainingAddress(SymbolAddress)) { 2571 // Note: this assertion is trying to check sanity of BinaryData objects 2572 // but AArch64 has inferred and incomplete object locations coming from 2573 // GOT/TLS or any other non-trivial relocation (that requires creation 2574 // of sections and whose symbol address is not really what should be 2575 // encoded in the instruction). So we essentially disabled this check 2576 // for AArch64 and live with bogus names for objects. 2577 assert((IsAArch64 || IsSectionRelocation || 2578 BD->nameStartsWith(SymbolName) || 2579 BD->nameStartsWith("PG" + SymbolName) || 2580 (BD->nameStartsWith("ANONYMOUS") && 2581 (BD->getSectionName().startswith(".plt") || 2582 BD->getSectionName().endswith(".plt")))) && 2583 "BOLT symbol names of all non-section relocations must match " 2584 "up with symbol names referenced in the relocation"); 2585 2586 if (IsSectionRelocation) 2587 BC->markAmbiguousRelocations(*BD, Address); 2588 2589 ReferencedSymbol = BD->getSymbol(); 2590 Addend += (SymbolAddress - BD->getAddress()); 2591 SymbolAddress = BD->getAddress(); 2592 assert(Address == SymbolAddress + Addend); 2593 } else { 2594 // These are mostly local data symbols but undefined symbols 2595 // in relocation sections can get through here too, from .plt. 2596 assert( 2597 (IsAArch64 || IsSectionRelocation || 2598 BC->getSectionNameForAddress(SymbolAddress)->startswith(".plt")) && 2599 "known symbols should not resolve to anonymous locals"); 2600 2601 if (IsSectionRelocation) { 2602 ReferencedSymbol = 2603 BC->getOrCreateGlobalSymbol(SymbolAddress, "SYMBOLat"); 2604 } else { 2605 SymbolRef Symbol = *Rel.getSymbol(); 2606 const uint64_t SymbolSize = 2607 IsAArch64 ? 0 : ELFSymbolRef(Symbol).getSize(); 2608 const uint64_t SymbolAlignment = 2609 IsAArch64 ? 1 : Symbol.getAlignment(); 2610 const uint32_t SymbolFlags = cantFail(Symbol.getFlags()); 2611 std::string Name; 2612 if (SymbolFlags & SymbolRef::SF_Global) { 2613 Name = SymbolName; 2614 } else { 2615 if (StringRef(SymbolName) 2616 .startswith(BC->AsmInfo->getPrivateGlobalPrefix())) 2617 Name = NR.uniquify("PG" + SymbolName); 2618 else 2619 Name = NR.uniquify(SymbolName); 2620 } 2621 ReferencedSymbol = BC->registerNameAtAddress( 2622 Name, SymbolAddress, SymbolSize, SymbolAlignment, SymbolFlags); 2623 } 2624 2625 if (IsSectionRelocation) { 2626 BinaryData *BD = BC->getBinaryDataByName(ReferencedSymbol->getName()); 2627 BC->markAmbiguousRelocations(*BD, Address); 2628 } 2629 } 2630 } 2631 2632 auto checkMaxDataRelocations = [&]() { 2633 ++NumDataRelocations; 2634 if (opts::MaxDataRelocations && 2635 NumDataRelocations + 1 == opts::MaxDataRelocations) { 2636 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: processing ending on data relocation " 2637 << NumDataRelocations << ": "); 2638 printRelocationInfo(Rel, ReferencedSymbol->getName(), SymbolAddress, 2639 Addend, ExtractedValue); 2640 } 2641 2642 return (!opts::MaxDataRelocations || 2643 NumDataRelocations < opts::MaxDataRelocations); 2644 }; 2645 2646 if ((RefSection && refersToReorderedSection(RefSection)) || 2647 (opts::ForceToDataRelocations && checkMaxDataRelocations())) 2648 ForceRelocation = true; 2649 2650 if (IsFromCode) { 2651 ContainingBF->addRelocation(Rel.getOffset(), ReferencedSymbol, RType, 2652 Addend, ExtractedValue); 2653 } else if (IsToCode || ForceRelocation) { 2654 BC->addRelocation(Rel.getOffset(), ReferencedSymbol, RType, Addend, 2655 ExtractedValue); 2656 } else { 2657 LLVM_DEBUG( 2658 dbgs() << "BOLT-DEBUG: ignoring relocation from data to data\n"); 2659 } 2660 } 2661 } 2662 2663 void RewriteInstance::selectFunctionsToProcess() { 2664 // Extend the list of functions to process or skip from a file. 2665 auto populateFunctionNames = [](cl::opt<std::string> &FunctionNamesFile, 2666 cl::list<std::string> &FunctionNames) { 2667 if (FunctionNamesFile.empty()) 2668 return; 2669 std::ifstream FuncsFile(FunctionNamesFile, std::ios::in); 2670 std::string FuncName; 2671 while (std::getline(FuncsFile, FuncName)) 2672 FunctionNames.push_back(FuncName); 2673 }; 2674 populateFunctionNames(opts::FunctionNamesFile, opts::ForceFunctionNames); 2675 populateFunctionNames(opts::SkipFunctionNamesFile, opts::SkipFunctionNames); 2676 populateFunctionNames(opts::FunctionNamesFileNR, opts::ForceFunctionNamesNR); 2677 2678 // Make a set of functions to process to speed up lookups. 2679 std::unordered_set<std::string> ForceFunctionsNR( 2680 opts::ForceFunctionNamesNR.begin(), opts::ForceFunctionNamesNR.end()); 2681 2682 if ((!opts::ForceFunctionNames.empty() || 2683 !opts::ForceFunctionNamesNR.empty()) && 2684 !opts::SkipFunctionNames.empty()) { 2685 errs() << "BOLT-ERROR: cannot select functions to process and skip at the " 2686 "same time. Please use only one type of selection.\n"; 2687 exit(1); 2688 } 2689 2690 uint64_t LiteThresholdExecCount = 0; 2691 if (opts::LiteThresholdPct) { 2692 if (opts::LiteThresholdPct > 100) 2693 opts::LiteThresholdPct = 100; 2694 2695 std::vector<const BinaryFunction *> TopFunctions; 2696 for (auto &BFI : BC->getBinaryFunctions()) { 2697 const BinaryFunction &Function = BFI.second; 2698 if (ProfileReader->mayHaveProfileData(Function)) 2699 TopFunctions.push_back(&Function); 2700 } 2701 std::sort(TopFunctions.begin(), TopFunctions.end(), 2702 [](const BinaryFunction *A, const BinaryFunction *B) { 2703 return 2704 A->getKnownExecutionCount() < B->getKnownExecutionCount(); 2705 }); 2706 2707 size_t Index = TopFunctions.size() * opts::LiteThresholdPct / 100; 2708 if (Index) 2709 --Index; 2710 LiteThresholdExecCount = TopFunctions[Index]->getKnownExecutionCount(); 2711 outs() << "BOLT-INFO: limiting processing to functions with at least " 2712 << LiteThresholdExecCount << " invocations\n"; 2713 } 2714 LiteThresholdExecCount = std::max( 2715 LiteThresholdExecCount, static_cast<uint64_t>(opts::LiteThresholdCount)); 2716 2717 uint64_t NumFunctionsToProcess = 0; 2718 auto shouldProcess = [&](const BinaryFunction &Function) { 2719 if (opts::MaxFunctions && NumFunctionsToProcess > opts::MaxFunctions) 2720 return false; 2721 2722 // If the list is not empty, only process functions from the list. 2723 if (!opts::ForceFunctionNames.empty() || !ForceFunctionsNR.empty()) { 2724 // Regex check (-funcs and -funcs-file options). 2725 for (std::string &Name : opts::ForceFunctionNames) 2726 if (Function.hasNameRegex(Name)) 2727 return true; 2728 2729 // Non-regex check (-funcs-no-regex and -funcs-file-no-regex). 2730 Optional<StringRef> Match = 2731 Function.forEachName([&ForceFunctionsNR](StringRef Name) { 2732 return ForceFunctionsNR.count(Name.str()); 2733 }); 2734 return Match.hasValue(); 2735 } 2736 2737 for (std::string &Name : opts::SkipFunctionNames) 2738 if (Function.hasNameRegex(Name)) 2739 return false; 2740 2741 if (opts::Lite) { 2742 if (ProfileReader && !ProfileReader->mayHaveProfileData(Function)) 2743 return false; 2744 2745 if (Function.getKnownExecutionCount() < LiteThresholdExecCount) 2746 return false; 2747 } 2748 2749 return true; 2750 }; 2751 2752 for (auto &BFI : BC->getBinaryFunctions()) { 2753 BinaryFunction &Function = BFI.second; 2754 2755 // Pseudo functions are explicitly marked by us not to be processed. 2756 if (Function.isPseudo()) { 2757 Function.IsIgnored = true; 2758 Function.HasExternalRefRelocations = true; 2759 continue; 2760 } 2761 2762 if (!shouldProcess(Function)) { 2763 LLVM_DEBUG(dbgs() << "BOLT-INFO: skipping processing of function " 2764 << Function << " per user request\n"); 2765 Function.setIgnored(); 2766 } else { 2767 ++NumFunctionsToProcess; 2768 if (opts::MaxFunctions && NumFunctionsToProcess == opts::MaxFunctions) 2769 outs() << "BOLT-INFO: processing ending on " << Function << '\n'; 2770 } 2771 } 2772 } 2773 2774 void RewriteInstance::readDebugInfo() { 2775 NamedRegionTimer T("readDebugInfo", "read debug info", TimerGroupName, 2776 TimerGroupDesc, opts::TimeRewrite); 2777 if (!opts::UpdateDebugSections) 2778 return; 2779 2780 BC->preprocessDebugInfo(); 2781 } 2782 2783 void RewriteInstance::preprocessProfileData() { 2784 if (!ProfileReader) 2785 return; 2786 2787 NamedRegionTimer T("preprocessprofile", "pre-process profile data", 2788 TimerGroupName, TimerGroupDesc, opts::TimeRewrite); 2789 2790 outs() << "BOLT-INFO: pre-processing profile using " 2791 << ProfileReader->getReaderName() << '\n'; 2792 2793 if (BAT->enabledFor(InputFile)) { 2794 outs() << "BOLT-INFO: profile collection done on a binary already " 2795 "processed by BOLT\n"; 2796 ProfileReader->setBAT(&*BAT); 2797 } 2798 2799 if (Error E = ProfileReader->preprocessProfile(*BC.get())) 2800 report_error("cannot pre-process profile", std::move(E)); 2801 2802 if (!BC->hasSymbolsWithFileName() && ProfileReader->hasLocalsWithFileName() && 2803 !opts::AllowStripped) { 2804 errs() << "BOLT-ERROR: input binary does not have local file symbols " 2805 "but profile data includes function names with embedded file " 2806 "names. It appears that the input binary was stripped while a " 2807 "profiled binary was not. If you know what you are doing and " 2808 "wish to proceed, use -allow-stripped option.\n"; 2809 exit(1); 2810 } 2811 } 2812 2813 void RewriteInstance::processProfileDataPreCFG() { 2814 if (!ProfileReader) 2815 return; 2816 2817 NamedRegionTimer T("processprofile-precfg", "process profile data pre-CFG", 2818 TimerGroupName, TimerGroupDesc, opts::TimeRewrite); 2819 2820 if (Error E = ProfileReader->readProfilePreCFG(*BC.get())) 2821 report_error("cannot read profile pre-CFG", std::move(E)); 2822 } 2823 2824 void RewriteInstance::processProfileData() { 2825 if (!ProfileReader) 2826 return; 2827 2828 NamedRegionTimer T("processprofile", "process profile data", TimerGroupName, 2829 TimerGroupDesc, opts::TimeRewrite); 2830 2831 if (Error E = ProfileReader->readProfile(*BC.get())) 2832 report_error("cannot read profile", std::move(E)); 2833 2834 if (!opts::SaveProfile.empty()) { 2835 YAMLProfileWriter PW(opts::SaveProfile); 2836 PW.writeProfile(*this); 2837 } 2838 2839 // Release memory used by profile reader. 2840 ProfileReader.reset(); 2841 2842 if (opts::AggregateOnly) 2843 exit(0); 2844 } 2845 2846 void RewriteInstance::disassembleFunctions() { 2847 NamedRegionTimer T("disassembleFunctions", "disassemble functions", 2848 TimerGroupName, TimerGroupDesc, opts::TimeRewrite); 2849 for (auto &BFI : BC->getBinaryFunctions()) { 2850 BinaryFunction &Function = BFI.second; 2851 2852 ErrorOr<ArrayRef<uint8_t>> FunctionData = Function.getData(); 2853 if (!FunctionData) { 2854 errs() << "BOLT-ERROR: corresponding section is non-executable or " 2855 << "empty for function " << Function << '\n'; 2856 exit(1); 2857 } 2858 2859 // Treat zero-sized functions as non-simple ones. 2860 if (Function.getSize() == 0) { 2861 Function.setSimple(false); 2862 continue; 2863 } 2864 2865 // Offset of the function in the file. 2866 const auto *FileBegin = 2867 reinterpret_cast<const uint8_t *>(InputFile->getData().data()); 2868 Function.setFileOffset(FunctionData->begin() - FileBegin); 2869 2870 if (!shouldDisassemble(Function)) { 2871 NamedRegionTimer T("scan", "scan functions", "buildfuncs", 2872 "Scan Binary Functions", opts::TimeBuild); 2873 Function.scanExternalRefs(); 2874 Function.setSimple(false); 2875 continue; 2876 } 2877 2878 if (!Function.disassemble()) { 2879 if (opts::processAllFunctions()) 2880 BC->exitWithBugReport("function cannot be properly disassembled. " 2881 "Unable to continue in relocation mode.", 2882 Function); 2883 if (opts::Verbosity >= 1) 2884 outs() << "BOLT-INFO: could not disassemble function " << Function 2885 << ". Will ignore.\n"; 2886 // Forcefully ignore the function. 2887 Function.setIgnored(); 2888 continue; 2889 } 2890 2891 if (opts::PrintAll || opts::PrintDisasm) 2892 Function.print(outs(), "after disassembly", true); 2893 2894 BC->processInterproceduralReferences(Function); 2895 } 2896 2897 BC->populateJumpTables(); 2898 BC->skipMarkedFragments(); 2899 2900 for (auto &BFI : BC->getBinaryFunctions()) { 2901 BinaryFunction &Function = BFI.second; 2902 2903 if (!shouldDisassemble(Function)) 2904 continue; 2905 2906 Function.postProcessEntryPoints(); 2907 Function.postProcessJumpTables(); 2908 } 2909 2910 BC->adjustCodePadding(); 2911 2912 for (auto &BFI : BC->getBinaryFunctions()) { 2913 BinaryFunction &Function = BFI.second; 2914 2915 if (!shouldDisassemble(Function)) 2916 continue; 2917 2918 if (!Function.isSimple()) { 2919 assert((!BC->HasRelocations || Function.getSize() == 0) && 2920 "unexpected non-simple function in relocation mode"); 2921 continue; 2922 } 2923 2924 // Fill in CFI information for this function 2925 if (!Function.trapsOnEntry() && !CFIRdWrt->fillCFIInfoFor(Function)) { 2926 if (BC->HasRelocations) { 2927 BC->exitWithBugReport("unable to fill CFI.", Function); 2928 } else { 2929 errs() << "BOLT-WARNING: unable to fill CFI for function " << Function 2930 << ". Skipping.\n"; 2931 Function.setSimple(false); 2932 continue; 2933 } 2934 } 2935 2936 // Parse LSDA. 2937 if (Function.getLSDAAddress() != 0) 2938 Function.parseLSDA(getLSDAData(), getLSDAAddress()); 2939 } 2940 } 2941 2942 void RewriteInstance::buildFunctionsCFG() { 2943 NamedRegionTimer T("buildCFG", "buildCFG", "buildfuncs", 2944 "Build Binary Functions", opts::TimeBuild); 2945 2946 // Create annotation indices to allow lock-free execution 2947 BC->MIB->getOrCreateAnnotationIndex("JTIndexReg"); 2948 BC->MIB->getOrCreateAnnotationIndex("NOP"); 2949 BC->MIB->getOrCreateAnnotationIndex("Size"); 2950 2951 ParallelUtilities::WorkFuncWithAllocTy WorkFun = 2952 [&](BinaryFunction &BF, MCPlusBuilder::AllocatorIdTy AllocId) { 2953 if (!BF.buildCFG(AllocId)) 2954 return; 2955 2956 if (opts::PrintAll) { 2957 auto L = BC->scopeLock(); 2958 BF.print(outs(), "while building cfg", true); 2959 } 2960 }; 2961 2962 ParallelUtilities::PredicateTy SkipPredicate = [&](const BinaryFunction &BF) { 2963 return !shouldDisassemble(BF) || !BF.isSimple(); 2964 }; 2965 2966 ParallelUtilities::runOnEachFunctionWithUniqueAllocId( 2967 *BC, ParallelUtilities::SchedulingPolicy::SP_INST_LINEAR, WorkFun, 2968 SkipPredicate, "disassembleFunctions-buildCFG", 2969 /*ForceSequential*/ opts::SequentialDisassembly || opts::PrintAll); 2970 2971 BC->postProcessSymbolTable(); 2972 } 2973 2974 void RewriteInstance::postProcessFunctions() { 2975 BC->TotalScore = 0; 2976 BC->SumExecutionCount = 0; 2977 for (auto &BFI : BC->getBinaryFunctions()) { 2978 BinaryFunction &Function = BFI.second; 2979 2980 if (Function.empty()) 2981 continue; 2982 2983 Function.postProcessCFG(); 2984 2985 if (opts::PrintAll || opts::PrintCFG) 2986 Function.print(outs(), "after building cfg", true); 2987 2988 if (opts::DumpDotAll) 2989 Function.dumpGraphForPass("00_build-cfg"); 2990 2991 if (opts::PrintLoopInfo) { 2992 Function.calculateLoopInfo(); 2993 Function.printLoopInfo(outs()); 2994 } 2995 2996 BC->TotalScore += Function.getFunctionScore(); 2997 BC->SumExecutionCount += Function.getKnownExecutionCount(); 2998 } 2999 3000 if (opts::PrintGlobals) { 3001 outs() << "BOLT-INFO: Global symbols:\n"; 3002 BC->printGlobalSymbols(outs()); 3003 } 3004 } 3005 3006 void RewriteInstance::runOptimizationPasses() { 3007 NamedRegionTimer T("runOptimizationPasses", "run optimization passes", 3008 TimerGroupName, TimerGroupDesc, opts::TimeRewrite); 3009 BinaryFunctionPassManager::runAllPasses(*BC); 3010 } 3011 3012 namespace { 3013 3014 class BOLTSymbolResolver : public JITSymbolResolver { 3015 BinaryContext &BC; 3016 3017 public: 3018 BOLTSymbolResolver(BinaryContext &BC) : BC(BC) {} 3019 3020 // We are responsible for all symbols 3021 Expected<LookupSet> getResponsibilitySet(const LookupSet &Symbols) override { 3022 return Symbols; 3023 } 3024 3025 // Some of our symbols may resolve to zero and this should not be an error 3026 bool allowsZeroSymbols() override { return true; } 3027 3028 /// Resolves the address of each symbol requested 3029 void lookup(const LookupSet &Symbols, 3030 OnResolvedFunction OnResolved) override { 3031 JITSymbolResolver::LookupResult AllResults; 3032 3033 if (BC.EFMM->ObjectsLoaded) { 3034 for (const StringRef &Symbol : Symbols) { 3035 std::string SymName = Symbol.str(); 3036 LLVM_DEBUG(dbgs() << "BOLT: looking for " << SymName << "\n"); 3037 // Resolve to a PLT entry if possible 3038 if (const BinaryData *I = BC.getPLTBinaryDataByName(SymName)) { 3039 AllResults[Symbol] = 3040 JITEvaluatedSymbol(I->getAddress(), JITSymbolFlags()); 3041 continue; 3042 } 3043 OnResolved(make_error<StringError>( 3044 "Symbol not found required by runtime: " + Symbol, 3045 inconvertibleErrorCode())); 3046 return; 3047 } 3048 OnResolved(std::move(AllResults)); 3049 return; 3050 } 3051 3052 for (const StringRef &Symbol : Symbols) { 3053 std::string SymName = Symbol.str(); 3054 LLVM_DEBUG(dbgs() << "BOLT: looking for " << SymName << "\n"); 3055 3056 if (BinaryData *I = BC.getBinaryDataByName(SymName)) { 3057 uint64_t Address = I->isMoved() && !I->isJumpTable() 3058 ? I->getOutputAddress() 3059 : I->getAddress(); 3060 LLVM_DEBUG(dbgs() << "Resolved to address 0x" 3061 << Twine::utohexstr(Address) << "\n"); 3062 AllResults[Symbol] = JITEvaluatedSymbol(Address, JITSymbolFlags()); 3063 continue; 3064 } 3065 LLVM_DEBUG(dbgs() << "Resolved to address 0x0\n"); 3066 AllResults[Symbol] = JITEvaluatedSymbol(0, JITSymbolFlags()); 3067 } 3068 3069 OnResolved(std::move(AllResults)); 3070 } 3071 }; 3072 3073 } // anonymous namespace 3074 3075 void RewriteInstance::emitAndLink() { 3076 NamedRegionTimer T("emitAndLink", "emit and link", TimerGroupName, 3077 TimerGroupDesc, opts::TimeRewrite); 3078 std::error_code EC; 3079 3080 // This is an object file, which we keep for debugging purposes. 3081 // Once we decide it's useless, we should create it in memory. 3082 SmallString<128> OutObjectPath; 3083 sys::fs::getPotentiallyUniqueTempFileName("output", "o", OutObjectPath); 3084 std::unique_ptr<ToolOutputFile> TempOut = 3085 std::make_unique<ToolOutputFile>(OutObjectPath, EC, sys::fs::OF_None); 3086 check_error(EC, "cannot create output object file"); 3087 3088 std::unique_ptr<buffer_ostream> BOS = 3089 std::make_unique<buffer_ostream>(TempOut->os()); 3090 raw_pwrite_stream *OS = BOS.get(); 3091 3092 // Implicitly MCObjectStreamer takes ownership of MCAsmBackend (MAB) 3093 // and MCCodeEmitter (MCE). ~MCObjectStreamer() will delete these 3094 // two instances. 3095 std::unique_ptr<MCStreamer> Streamer = BC->createStreamer(*OS); 3096 3097 if (EHFrameSection) { 3098 if (opts::UseOldText || opts::StrictMode) { 3099 // The section is going to be regenerated from scratch. 3100 // Empty the contents, but keep the section reference. 3101 EHFrameSection->clearContents(); 3102 } else { 3103 // Make .eh_frame relocatable. 3104 relocateEHFrameSection(); 3105 } 3106 } 3107 3108 emitBinaryContext(*Streamer, *BC, getOrgSecPrefix()); 3109 3110 Streamer->Finish(); 3111 3112 ////////////////////////////////////////////////////////////////////////////// 3113 // Assign addresses to new sections. 3114 ////////////////////////////////////////////////////////////////////////////// 3115 3116 // Get output object as ObjectFile. 3117 std::unique_ptr<MemoryBuffer> ObjectMemBuffer = 3118 MemoryBuffer::getMemBuffer(BOS->str(), "in-memory object file", false); 3119 std::unique_ptr<object::ObjectFile> Obj = cantFail( 3120 object::ObjectFile::createObjectFile(ObjectMemBuffer->getMemBufferRef()), 3121 "error creating in-memory object"); 3122 3123 BOLTSymbolResolver Resolver = BOLTSymbolResolver(*BC); 3124 3125 MCAsmLayout FinalLayout( 3126 static_cast<MCObjectStreamer *>(Streamer.get())->getAssembler()); 3127 3128 RTDyld.reset(new decltype(RTDyld)::element_type(*BC->EFMM, Resolver)); 3129 RTDyld->setProcessAllSections(false); 3130 RTDyld->loadObject(*Obj); 3131 3132 // Assign addresses to all sections. If key corresponds to the object 3133 // created by ourselves, call our regular mapping function. If we are 3134 // loading additional objects as part of runtime libraries for 3135 // instrumentation, treat them as extra sections. 3136 mapFileSections(*RTDyld); 3137 3138 RTDyld->finalizeWithMemoryManagerLocking(); 3139 if (RTDyld->hasError()) { 3140 outs() << "BOLT-ERROR: RTDyld failed: " << RTDyld->getErrorString() << "\n"; 3141 exit(1); 3142 } 3143 3144 // Update output addresses based on the new section map and 3145 // layout. Only do this for the object created by ourselves. 3146 updateOutputValues(FinalLayout); 3147 3148 if (opts::UpdateDebugSections) 3149 DebugInfoRewriter->updateLineTableOffsets(FinalLayout); 3150 3151 if (RuntimeLibrary *RtLibrary = BC->getRuntimeLibrary()) 3152 RtLibrary->link(*BC, ToolPath, *RTDyld, [this](RuntimeDyld &R) { 3153 this->mapExtraSections(*RTDyld); 3154 }); 3155 3156 // Once the code is emitted, we can rename function sections to actual 3157 // output sections and de-register sections used for emission. 3158 for (BinaryFunction *Function : BC->getAllBinaryFunctions()) { 3159 ErrorOr<BinarySection &> Section = Function->getCodeSection(); 3160 if (Section && 3161 (Function->getImageAddress() == 0 || Function->getImageSize() == 0)) 3162 continue; 3163 3164 // Restore origin section for functions that were emitted or supposed to 3165 // be emitted to patch sections. 3166 if (Section) 3167 BC->deregisterSection(*Section); 3168 assert(Function->getOriginSectionName() && "expected origin section"); 3169 Function->CodeSectionName = std::string(*Function->getOriginSectionName()); 3170 if (Function->isSplit()) { 3171 if (ErrorOr<BinarySection &> ColdSection = Function->getColdCodeSection()) 3172 BC->deregisterSection(*ColdSection); 3173 Function->ColdCodeSectionName = std::string(getBOLTTextSectionName()); 3174 } 3175 } 3176 3177 if (opts::PrintCacheMetrics) { 3178 outs() << "BOLT-INFO: cache metrics after emitting functions:\n"; 3179 CacheMetrics::printAll(BC->getSortedFunctions()); 3180 } 3181 3182 if (opts::KeepTmp) { 3183 TempOut->keep(); 3184 outs() << "BOLT-INFO: intermediary output object file saved for debugging " 3185 "purposes: " 3186 << OutObjectPath << "\n"; 3187 } 3188 } 3189 3190 void RewriteInstance::updateMetadata() { 3191 updateSDTMarkers(); 3192 updateLKMarkers(); 3193 parsePseudoProbe(); 3194 updatePseudoProbes(); 3195 3196 if (opts::UpdateDebugSections) { 3197 NamedRegionTimer T("updateDebugInfo", "update debug info", TimerGroupName, 3198 TimerGroupDesc, opts::TimeRewrite); 3199 DebugInfoRewriter->updateDebugInfo(); 3200 } 3201 3202 if (opts::WriteBoltInfoSection) 3203 addBoltInfoSection(); 3204 } 3205 3206 void RewriteInstance::updatePseudoProbes() { 3207 // check if there is pseudo probe section decoded 3208 if (BC->ProbeDecoder.getAddress2ProbesMap().empty()) 3209 return; 3210 // input address converted to output 3211 AddressProbesMap &Address2ProbesMap = BC->ProbeDecoder.getAddress2ProbesMap(); 3212 const GUIDProbeFunctionMap &GUID2Func = 3213 BC->ProbeDecoder.getGUID2FuncDescMap(); 3214 3215 for (auto &AP : Address2ProbesMap) { 3216 BinaryFunction *F = BC->getBinaryFunctionContainingAddress(AP.first); 3217 // If F is removed, eliminate all probes inside it from inline tree 3218 // Setting probes' addresses as INT64_MAX means elimination 3219 if (!F) { 3220 for (MCDecodedPseudoProbe &Probe : AP.second) 3221 Probe.setAddress(INT64_MAX); 3222 continue; 3223 } 3224 // If F is not emitted, the function will remain in the same address as its 3225 // input 3226 if (!F->isEmitted()) 3227 continue; 3228 3229 uint64_t Offset = AP.first - F->getAddress(); 3230 const BinaryBasicBlock *BB = F->getBasicBlockContainingOffset(Offset); 3231 uint64_t BlkOutputAddress = BB->getOutputAddressRange().first; 3232 // Check if block output address is defined. 3233 // If not, such block is removed from binary. Then remove the probes from 3234 // inline tree 3235 if (BlkOutputAddress == 0) { 3236 for (MCDecodedPseudoProbe &Probe : AP.second) 3237 Probe.setAddress(INT64_MAX); 3238 continue; 3239 } 3240 3241 unsigned ProbeTrack = AP.second.size(); 3242 std::list<MCDecodedPseudoProbe>::iterator Probe = AP.second.begin(); 3243 while (ProbeTrack != 0) { 3244 if (Probe->isBlock()) { 3245 Probe->setAddress(BlkOutputAddress); 3246 } else if (Probe->isCall()) { 3247 // A call probe may be duplicated due to ICP 3248 // Go through output of InputOffsetToAddressMap to collect all related 3249 // probes 3250 const InputOffsetToAddressMapTy &Offset2Addr = 3251 F->getInputOffsetToAddressMap(); 3252 auto CallOutputAddresses = Offset2Addr.equal_range(Offset); 3253 auto CallOutputAddress = CallOutputAddresses.first; 3254 if (CallOutputAddress == CallOutputAddresses.second) { 3255 Probe->setAddress(INT64_MAX); 3256 } else { 3257 Probe->setAddress(CallOutputAddress->second); 3258 CallOutputAddress = std::next(CallOutputAddress); 3259 } 3260 3261 while (CallOutputAddress != CallOutputAddresses.second) { 3262 AP.second.push_back(*Probe); 3263 AP.second.back().setAddress(CallOutputAddress->second); 3264 Probe->getInlineTreeNode()->addProbes(&(AP.second.back())); 3265 CallOutputAddress = std::next(CallOutputAddress); 3266 } 3267 } 3268 Probe = std::next(Probe); 3269 ProbeTrack--; 3270 } 3271 } 3272 3273 if (opts::PrintPseudoProbes == opts::PrintPseudoProbesOptions::PPP_All || 3274 opts::PrintPseudoProbes == 3275 opts::PrintPseudoProbesOptions::PPP_Probes_Address_Conversion) { 3276 outs() << "Pseudo Probe Address Conversion results:\n"; 3277 // table that correlates address to block 3278 std::unordered_map<uint64_t, StringRef> Addr2BlockNames; 3279 for (auto &F : BC->getBinaryFunctions()) 3280 for (BinaryBasicBlock &BinaryBlock : F.second) 3281 Addr2BlockNames[BinaryBlock.getOutputAddressRange().first] = 3282 BinaryBlock.getName(); 3283 3284 // scan all addresses -> correlate probe to block when print out 3285 std::vector<uint64_t> Addresses; 3286 for (auto &Entry : Address2ProbesMap) 3287 Addresses.push_back(Entry.first); 3288 std::sort(Addresses.begin(), Addresses.end()); 3289 for (uint64_t Key : Addresses) { 3290 for (MCDecodedPseudoProbe &Probe : Address2ProbesMap[Key]) { 3291 if (Probe.getAddress() == INT64_MAX) 3292 outs() << "Deleted Probe: "; 3293 else 3294 outs() << "Address: " << format_hex(Probe.getAddress(), 8) << " "; 3295 Probe.print(outs(), GUID2Func, true); 3296 // print block name only if the probe is block type and undeleted. 3297 if (Probe.isBlock() && Probe.getAddress() != INT64_MAX) 3298 outs() << format_hex(Probe.getAddress(), 8) << " Probe is in " 3299 << Addr2BlockNames[Probe.getAddress()] << "\n"; 3300 } 3301 } 3302 outs() << "=======================================\n"; 3303 } 3304 3305 // encode pseudo probes with updated addresses 3306 encodePseudoProbes(); 3307 } 3308 3309 template <typename F> 3310 static void emitLEB128IntValue(F encode, uint64_t Value, 3311 SmallString<8> &Contents) { 3312 SmallString<128> Tmp; 3313 raw_svector_ostream OSE(Tmp); 3314 encode(Value, OSE); 3315 Contents.append(OSE.str().begin(), OSE.str().end()); 3316 } 3317 3318 void RewriteInstance::encodePseudoProbes() { 3319 // Buffer for new pseudo probes section 3320 SmallString<8> Contents; 3321 MCDecodedPseudoProbe *LastProbe = nullptr; 3322 3323 auto EmitInt = [&](uint64_t Value, uint32_t Size) { 3324 const bool IsLittleEndian = BC->AsmInfo->isLittleEndian(); 3325 uint64_t Swapped = support::endian::byte_swap( 3326 Value, IsLittleEndian ? support::little : support::big); 3327 unsigned Index = IsLittleEndian ? 0 : 8 - Size; 3328 auto Entry = StringRef(reinterpret_cast<char *>(&Swapped) + Index, Size); 3329 Contents.append(Entry.begin(), Entry.end()); 3330 }; 3331 3332 auto EmitULEB128IntValue = [&](uint64_t Value) { 3333 SmallString<128> Tmp; 3334 raw_svector_ostream OSE(Tmp); 3335 encodeULEB128(Value, OSE, 0); 3336 Contents.append(OSE.str().begin(), OSE.str().end()); 3337 }; 3338 3339 auto EmitSLEB128IntValue = [&](int64_t Value) { 3340 SmallString<128> Tmp; 3341 raw_svector_ostream OSE(Tmp); 3342 encodeSLEB128(Value, OSE); 3343 Contents.append(OSE.str().begin(), OSE.str().end()); 3344 }; 3345 3346 // Emit indiviual pseudo probes in a inline tree node 3347 // Probe index, type, attribute, address type and address are encoded 3348 // Address of the first probe is absolute. 3349 // Other probes' address are represented by delta 3350 auto EmitDecodedPseudoProbe = [&](MCDecodedPseudoProbe *&CurProbe) { 3351 EmitULEB128IntValue(CurProbe->getIndex()); 3352 uint8_t PackedType = CurProbe->getType() | (CurProbe->getAttributes() << 4); 3353 uint8_t Flag = 3354 LastProbe ? ((int8_t)MCPseudoProbeFlag::AddressDelta << 7) : 0; 3355 EmitInt(Flag | PackedType, 1); 3356 if (LastProbe) { 3357 // Emit the delta between the address label and LastProbe. 3358 int64_t Delta = CurProbe->getAddress() - LastProbe->getAddress(); 3359 EmitSLEB128IntValue(Delta); 3360 } else { 3361 // Emit absolute address for encoding the first pseudo probe. 3362 uint32_t AddrSize = BC->AsmInfo->getCodePointerSize(); 3363 EmitInt(CurProbe->getAddress(), AddrSize); 3364 } 3365 }; 3366 3367 std::map<InlineSite, MCDecodedPseudoProbeInlineTree *, 3368 std::greater<InlineSite>> 3369 Inlinees; 3370 3371 // DFS of inline tree to emit pseudo probes in all tree node 3372 // Inline site index of a probe is emitted first. 3373 // Then tree node Guid, size of pseudo probes and children nodes, and detail 3374 // of contained probes are emitted Deleted probes are skipped Root node is not 3375 // encoded to binaries. It's a "wrapper" of inline trees of each function. 3376 std::list<std::pair<uint64_t, MCDecodedPseudoProbeInlineTree *>> NextNodes; 3377 const MCDecodedPseudoProbeInlineTree &Root = 3378 BC->ProbeDecoder.getDummyInlineRoot(); 3379 for (auto Child = Root.getChildren().begin(); 3380 Child != Root.getChildren().end(); ++Child) 3381 Inlinees[Child->first] = Child->second.get(); 3382 3383 for (auto Inlinee : Inlinees) 3384 // INT64_MAX is "placeholder" of unused callsite index field in the pair 3385 NextNodes.push_back({INT64_MAX, Inlinee.second}); 3386 3387 Inlinees.clear(); 3388 3389 while (!NextNodes.empty()) { 3390 uint64_t ProbeIndex = NextNodes.back().first; 3391 MCDecodedPseudoProbeInlineTree *Cur = NextNodes.back().second; 3392 NextNodes.pop_back(); 3393 3394 if (Cur->Parent && !Cur->Parent->isRoot()) 3395 // Emit probe inline site 3396 EmitULEB128IntValue(ProbeIndex); 3397 3398 // Emit probes grouped by GUID. 3399 LLVM_DEBUG({ 3400 dbgs().indent(MCPseudoProbeTable::DdgPrintIndent); 3401 dbgs() << "GUID: " << Cur->Guid << "\n"; 3402 }); 3403 // Emit Guid 3404 EmitInt(Cur->Guid, 8); 3405 // Emit number of probes in this node 3406 uint64_t Deleted = 0; 3407 for (MCDecodedPseudoProbe *&Probe : Cur->getProbes()) 3408 if (Probe->getAddress() == INT64_MAX) 3409 Deleted++; 3410 LLVM_DEBUG(dbgs() << "Deleted Probes:" << Deleted << "\n"); 3411 uint64_t ProbesSize = Cur->getProbes().size() - Deleted; 3412 EmitULEB128IntValue(ProbesSize); 3413 // Emit number of direct inlinees 3414 EmitULEB128IntValue(Cur->getChildren().size()); 3415 // Emit probes in this group 3416 for (MCDecodedPseudoProbe *&Probe : Cur->getProbes()) { 3417 if (Probe->getAddress() == INT64_MAX) 3418 continue; 3419 EmitDecodedPseudoProbe(Probe); 3420 LastProbe = Probe; 3421 } 3422 3423 for (auto Child = Cur->getChildren().begin(); 3424 Child != Cur->getChildren().end(); ++Child) 3425 Inlinees[Child->first] = Child->second.get(); 3426 for (const auto &Inlinee : Inlinees) { 3427 assert(Cur->Guid != 0 && "non root tree node must have nonzero Guid"); 3428 NextNodes.push_back({std::get<1>(Inlinee.first), Inlinee.second}); 3429 LLVM_DEBUG({ 3430 dbgs().indent(MCPseudoProbeTable::DdgPrintIndent); 3431 dbgs() << "InlineSite: " << std::get<1>(Inlinee.first) << "\n"; 3432 }); 3433 } 3434 Inlinees.clear(); 3435 } 3436 3437 // Create buffer for new contents for the section 3438 // Freed when parent section is destroyed 3439 uint8_t *Output = new uint8_t[Contents.str().size()]; 3440 memcpy(Output, Contents.str().data(), Contents.str().size()); 3441 addToDebugSectionsToOverwrite(".pseudo_probe"); 3442 BC->registerOrUpdateSection(".pseudo_probe", PseudoProbeSection->getELFType(), 3443 PseudoProbeSection->getELFFlags(), Output, 3444 Contents.str().size(), 1); 3445 if (opts::PrintPseudoProbes == opts::PrintPseudoProbesOptions::PPP_All || 3446 opts::PrintPseudoProbes == 3447 opts::PrintPseudoProbesOptions::PPP_Encoded_Probes) { 3448 // create a dummy decoder; 3449 MCPseudoProbeDecoder DummyDecoder; 3450 StringRef DescContents = PseudoProbeDescSection->getContents(); 3451 DummyDecoder.buildGUID2FuncDescMap( 3452 reinterpret_cast<const uint8_t *>(DescContents.data()), 3453 DescContents.size()); 3454 StringRef ProbeContents = PseudoProbeSection->getOutputContents(); 3455 DummyDecoder.buildAddress2ProbeMap( 3456 reinterpret_cast<const uint8_t *>(ProbeContents.data()), 3457 ProbeContents.size()); 3458 DummyDecoder.printProbesForAllAddresses(outs()); 3459 } 3460 } 3461 3462 void RewriteInstance::updateSDTMarkers() { 3463 NamedRegionTimer T("updateSDTMarkers", "update SDT markers", TimerGroupName, 3464 TimerGroupDesc, opts::TimeRewrite); 3465 3466 if (!SDTSection) 3467 return; 3468 SDTSection->registerPatcher(std::make_unique<SimpleBinaryPatcher>()); 3469 3470 SimpleBinaryPatcher *SDTNotePatcher = 3471 static_cast<SimpleBinaryPatcher *>(SDTSection->getPatcher()); 3472 for (auto &SDTInfoKV : BC->SDTMarkers) { 3473 const uint64_t OriginalAddress = SDTInfoKV.first; 3474 SDTMarkerInfo &SDTInfo = SDTInfoKV.second; 3475 const BinaryFunction *F = 3476 BC->getBinaryFunctionContainingAddress(OriginalAddress); 3477 if (!F) 3478 continue; 3479 const uint64_t NewAddress = 3480 F->translateInputToOutputAddress(OriginalAddress); 3481 SDTNotePatcher->addLE64Patch(SDTInfo.PCOffset, NewAddress); 3482 } 3483 } 3484 3485 void RewriteInstance::updateLKMarkers() { 3486 if (BC->LKMarkers.size() == 0) 3487 return; 3488 3489 NamedRegionTimer T("updateLKMarkers", "update LK markers", TimerGroupName, 3490 TimerGroupDesc, opts::TimeRewrite); 3491 3492 std::unordered_map<std::string, uint64_t> PatchCounts; 3493 for (std::pair<const uint64_t, std::vector<LKInstructionMarkerInfo>> 3494 &LKMarkerInfoKV : BC->LKMarkers) { 3495 const uint64_t OriginalAddress = LKMarkerInfoKV.first; 3496 const BinaryFunction *BF = 3497 BC->getBinaryFunctionContainingAddress(OriginalAddress, false, true); 3498 if (!BF) 3499 continue; 3500 3501 uint64_t NewAddress = BF->translateInputToOutputAddress(OriginalAddress); 3502 if (NewAddress == 0) 3503 continue; 3504 3505 // Apply base address. 3506 if (OriginalAddress >= 0xffffffff00000000 && NewAddress < 0xffffffff) 3507 NewAddress = NewAddress + 0xffffffff00000000; 3508 3509 if (OriginalAddress == NewAddress) 3510 continue; 3511 3512 for (LKInstructionMarkerInfo &LKMarkerInfo : LKMarkerInfoKV.second) { 3513 StringRef SectionName = LKMarkerInfo.SectionName; 3514 SimpleBinaryPatcher *LKPatcher; 3515 ErrorOr<BinarySection &> BSec = BC->getUniqueSectionByName(SectionName); 3516 assert(BSec && "missing section info for kernel section"); 3517 if (!BSec->getPatcher()) 3518 BSec->registerPatcher(std::make_unique<SimpleBinaryPatcher>()); 3519 LKPatcher = static_cast<SimpleBinaryPatcher *>(BSec->getPatcher()); 3520 PatchCounts[std::string(SectionName)]++; 3521 if (LKMarkerInfo.IsPCRelative) 3522 LKPatcher->addLE32Patch(LKMarkerInfo.SectionOffset, 3523 NewAddress - OriginalAddress + 3524 LKMarkerInfo.PCRelativeOffset); 3525 else 3526 LKPatcher->addLE64Patch(LKMarkerInfo.SectionOffset, NewAddress); 3527 } 3528 } 3529 outs() << "BOLT-INFO: patching linux kernel sections. Total patches per " 3530 "section are as follows:\n"; 3531 for (const std::pair<const std::string, uint64_t> &KV : PatchCounts) 3532 outs() << " Section: " << KV.first << ", patch-counts: " << KV.second 3533 << '\n'; 3534 } 3535 3536 void RewriteInstance::mapFileSections(RuntimeDyld &RTDyld) { 3537 mapCodeSections(RTDyld); 3538 mapDataSections(RTDyld); 3539 } 3540 3541 std::vector<BinarySection *> RewriteInstance::getCodeSections() { 3542 std::vector<BinarySection *> CodeSections; 3543 for (BinarySection &Section : BC->textSections()) 3544 if (Section.hasValidSectionID()) 3545 CodeSections.emplace_back(&Section); 3546 3547 auto compareSections = [&](const BinarySection *A, const BinarySection *B) { 3548 // Place movers before anything else. 3549 if (A->getName() == BC->getHotTextMoverSectionName()) 3550 return true; 3551 if (B->getName() == BC->getHotTextMoverSectionName()) 3552 return false; 3553 3554 // Depending on the option, put main text at the beginning or at the end. 3555 if (opts::HotFunctionsAtEnd) 3556 return B->getName() == BC->getMainCodeSectionName(); 3557 else 3558 return A->getName() == BC->getMainCodeSectionName(); 3559 }; 3560 3561 // Determine the order of sections. 3562 std::stable_sort(CodeSections.begin(), CodeSections.end(), compareSections); 3563 3564 return CodeSections; 3565 } 3566 3567 void RewriteInstance::mapCodeSections(RuntimeDyld &RTDyld) { 3568 if (BC->HasRelocations) { 3569 ErrorOr<BinarySection &> TextSection = 3570 BC->getUniqueSectionByName(BC->getMainCodeSectionName()); 3571 assert(TextSection && ".text section not found in output"); 3572 assert(TextSection->hasValidSectionID() && ".text section should be valid"); 3573 3574 // Map sections for functions with pre-assigned addresses. 3575 for (BinaryFunction *InjectedFunction : BC->getInjectedBinaryFunctions()) { 3576 const uint64_t OutputAddress = InjectedFunction->getOutputAddress(); 3577 if (!OutputAddress) 3578 continue; 3579 3580 ErrorOr<BinarySection &> FunctionSection = 3581 InjectedFunction->getCodeSection(); 3582 assert(FunctionSection && "function should have section"); 3583 FunctionSection->setOutputAddress(OutputAddress); 3584 RTDyld.reassignSectionAddress(FunctionSection->getSectionID(), 3585 OutputAddress); 3586 InjectedFunction->setImageAddress(FunctionSection->getAllocAddress()); 3587 InjectedFunction->setImageSize(FunctionSection->getOutputSize()); 3588 } 3589 3590 // Populate the list of sections to be allocated. 3591 std::vector<BinarySection *> CodeSections = getCodeSections(); 3592 3593 // Remove sections that were pre-allocated (patch sections). 3594 CodeSections.erase( 3595 std::remove_if(CodeSections.begin(), CodeSections.end(), 3596 [](BinarySection *Section) { 3597 return Section->getOutputAddress(); 3598 }), 3599 CodeSections.end()); 3600 LLVM_DEBUG(dbgs() << "Code sections in the order of output:\n"; 3601 for (const BinarySection *Section : CodeSections) 3602 dbgs() << Section->getName() << '\n'; 3603 ); 3604 3605 uint64_t PaddingSize = 0; // size of padding required at the end 3606 3607 // Allocate sections starting at a given Address. 3608 auto allocateAt = [&](uint64_t Address) { 3609 for (BinarySection *Section : CodeSections) { 3610 Address = alignTo(Address, Section->getAlignment()); 3611 Section->setOutputAddress(Address); 3612 Address += Section->getOutputSize(); 3613 } 3614 3615 // Make sure we allocate enough space for huge pages. 3616 if (opts::HotText) { 3617 uint64_t HotTextEnd = 3618 TextSection->getOutputAddress() + TextSection->getOutputSize(); 3619 HotTextEnd = alignTo(HotTextEnd, BC->PageAlign); 3620 if (HotTextEnd > Address) { 3621 PaddingSize = HotTextEnd - Address; 3622 Address = HotTextEnd; 3623 } 3624 } 3625 return Address; 3626 }; 3627 3628 // Check if we can fit code in the original .text 3629 bool AllocationDone = false; 3630 if (opts::UseOldText) { 3631 const uint64_t CodeSize = 3632 allocateAt(BC->OldTextSectionAddress) - BC->OldTextSectionAddress; 3633 3634 if (CodeSize <= BC->OldTextSectionSize) { 3635 outs() << "BOLT-INFO: using original .text for new code with 0x" 3636 << Twine::utohexstr(opts::AlignText) << " alignment\n"; 3637 AllocationDone = true; 3638 } else { 3639 errs() << "BOLT-WARNING: original .text too small to fit the new code" 3640 << " using 0x" << Twine::utohexstr(opts::AlignText) 3641 << " alignment. " << CodeSize << " bytes needed, have " 3642 << BC->OldTextSectionSize << " bytes available.\n"; 3643 opts::UseOldText = false; 3644 } 3645 } 3646 3647 if (!AllocationDone) 3648 NextAvailableAddress = allocateAt(NextAvailableAddress); 3649 3650 // Do the mapping for ORC layer based on the allocation. 3651 for (BinarySection *Section : CodeSections) { 3652 LLVM_DEBUG( 3653 dbgs() << "BOLT: mapping " << Section->getName() << " at 0x" 3654 << Twine::utohexstr(Section->getAllocAddress()) << " to 0x" 3655 << Twine::utohexstr(Section->getOutputAddress()) << '\n'); 3656 RTDyld.reassignSectionAddress(Section->getSectionID(), 3657 Section->getOutputAddress()); 3658 Section->setOutputFileOffset( 3659 getFileOffsetForAddress(Section->getOutputAddress())); 3660 } 3661 3662 // Check if we need to insert a padding section for hot text. 3663 if (PaddingSize && !opts::UseOldText) 3664 outs() << "BOLT-INFO: padding code to 0x" 3665 << Twine::utohexstr(NextAvailableAddress) 3666 << " to accommodate hot text\n"; 3667 3668 return; 3669 } 3670 3671 // Processing in non-relocation mode. 3672 uint64_t NewTextSectionStartAddress = NextAvailableAddress; 3673 3674 for (auto &BFI : BC->getBinaryFunctions()) { 3675 BinaryFunction &Function = BFI.second; 3676 if (!Function.isEmitted()) 3677 continue; 3678 3679 bool TooLarge = false; 3680 ErrorOr<BinarySection &> FuncSection = Function.getCodeSection(); 3681 assert(FuncSection && "cannot find section for function"); 3682 FuncSection->setOutputAddress(Function.getAddress()); 3683 LLVM_DEBUG(dbgs() << "BOLT: mapping 0x" 3684 << Twine::utohexstr(FuncSection->getAllocAddress()) 3685 << " to 0x" << Twine::utohexstr(Function.getAddress()) 3686 << '\n'); 3687 RTDyld.reassignSectionAddress(FuncSection->getSectionID(), 3688 Function.getAddress()); 3689 Function.setImageAddress(FuncSection->getAllocAddress()); 3690 Function.setImageSize(FuncSection->getOutputSize()); 3691 if (Function.getImageSize() > Function.getMaxSize()) { 3692 TooLarge = true; 3693 FailedAddresses.emplace_back(Function.getAddress()); 3694 } 3695 3696 // Map jump tables if updating in-place. 3697 if (opts::JumpTables == JTS_BASIC) { 3698 for (auto &JTI : Function.JumpTables) { 3699 JumpTable *JT = JTI.second; 3700 BinarySection &Section = JT->getOutputSection(); 3701 Section.setOutputAddress(JT->getAddress()); 3702 Section.setOutputFileOffset(getFileOffsetForAddress(JT->getAddress())); 3703 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: mapping " << Section.getName() 3704 << " to 0x" << Twine::utohexstr(JT->getAddress()) 3705 << '\n'); 3706 RTDyld.reassignSectionAddress(Section.getSectionID(), JT->getAddress()); 3707 } 3708 } 3709 3710 if (!Function.isSplit()) 3711 continue; 3712 3713 ErrorOr<BinarySection &> ColdSection = Function.getColdCodeSection(); 3714 assert(ColdSection && "cannot find section for cold part"); 3715 // Cold fragments are aligned at 16 bytes. 3716 NextAvailableAddress = alignTo(NextAvailableAddress, 16); 3717 BinaryFunction::FragmentInfo &ColdPart = Function.cold(); 3718 if (TooLarge) { 3719 // The corresponding FDE will refer to address 0. 3720 ColdPart.setAddress(0); 3721 ColdPart.setImageAddress(0); 3722 ColdPart.setImageSize(0); 3723 ColdPart.setFileOffset(0); 3724 } else { 3725 ColdPart.setAddress(NextAvailableAddress); 3726 ColdPart.setImageAddress(ColdSection->getAllocAddress()); 3727 ColdPart.setImageSize(ColdSection->getOutputSize()); 3728 ColdPart.setFileOffset(getFileOffsetForAddress(NextAvailableAddress)); 3729 ColdSection->setOutputAddress(ColdPart.getAddress()); 3730 } 3731 3732 LLVM_DEBUG(dbgs() << "BOLT: mapping cold fragment 0x" 3733 << Twine::utohexstr(ColdPart.getImageAddress()) 3734 << " to 0x" << Twine::utohexstr(ColdPart.getAddress()) 3735 << " with size " 3736 << Twine::utohexstr(ColdPart.getImageSize()) << '\n'); 3737 RTDyld.reassignSectionAddress(ColdSection->getSectionID(), 3738 ColdPart.getAddress()); 3739 3740 NextAvailableAddress += ColdPart.getImageSize(); 3741 } 3742 3743 // Add the new text section aggregating all existing code sections. 3744 // This is pseudo-section that serves a purpose of creating a corresponding 3745 // entry in section header table. 3746 int64_t NewTextSectionSize = 3747 NextAvailableAddress - NewTextSectionStartAddress; 3748 if (NewTextSectionSize) { 3749 const unsigned Flags = BinarySection::getFlags(/*IsReadOnly=*/true, 3750 /*IsText=*/true, 3751 /*IsAllocatable=*/true); 3752 BinarySection &Section = 3753 BC->registerOrUpdateSection(getBOLTTextSectionName(), 3754 ELF::SHT_PROGBITS, 3755 Flags, 3756 /*Data=*/nullptr, 3757 NewTextSectionSize, 3758 16); 3759 Section.setOutputAddress(NewTextSectionStartAddress); 3760 Section.setOutputFileOffset( 3761 getFileOffsetForAddress(NewTextSectionStartAddress)); 3762 } 3763 } 3764 3765 void RewriteInstance::mapDataSections(RuntimeDyld &RTDyld) { 3766 // Map special sections to their addresses in the output image. 3767 // These are the sections that we generate via MCStreamer. 3768 // The order is important. 3769 std::vector<std::string> Sections = { 3770 ".eh_frame", Twine(getOrgSecPrefix(), ".eh_frame").str(), 3771 ".gcc_except_table", ".rodata", ".rodata.cold"}; 3772 if (RuntimeLibrary *RtLibrary = BC->getRuntimeLibrary()) 3773 RtLibrary->addRuntimeLibSections(Sections); 3774 3775 for (std::string &SectionName : Sections) { 3776 ErrorOr<BinarySection &> Section = BC->getUniqueSectionByName(SectionName); 3777 if (!Section || !Section->isAllocatable() || !Section->isFinalized()) 3778 continue; 3779 NextAvailableAddress = 3780 alignTo(NextAvailableAddress, Section->getAlignment()); 3781 LLVM_DEBUG(dbgs() << "BOLT: mapping section " << SectionName << " (0x" 3782 << Twine::utohexstr(Section->getAllocAddress()) 3783 << ") to 0x" << Twine::utohexstr(NextAvailableAddress) 3784 << ":0x" 3785 << Twine::utohexstr(NextAvailableAddress + 3786 Section->getOutputSize()) 3787 << '\n'); 3788 3789 RTDyld.reassignSectionAddress(Section->getSectionID(), 3790 NextAvailableAddress); 3791 Section->setOutputAddress(NextAvailableAddress); 3792 Section->setOutputFileOffset(getFileOffsetForAddress(NextAvailableAddress)); 3793 3794 NextAvailableAddress += Section->getOutputSize(); 3795 } 3796 3797 // Handling for sections with relocations. 3798 for (BinarySection &Section : BC->sections()) { 3799 if (!Section.hasSectionRef()) 3800 continue; 3801 3802 StringRef SectionName = Section.getName(); 3803 ErrorOr<BinarySection &> OrgSection = 3804 BC->getUniqueSectionByName((getOrgSecPrefix() + SectionName).str()); 3805 if (!OrgSection || 3806 !OrgSection->isAllocatable() || 3807 !OrgSection->isFinalized() || 3808 !OrgSection->hasValidSectionID()) 3809 continue; 3810 3811 if (OrgSection->getOutputAddress()) { 3812 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: section " << SectionName 3813 << " is already mapped at 0x" 3814 << Twine::utohexstr(OrgSection->getOutputAddress()) 3815 << '\n'); 3816 continue; 3817 } 3818 LLVM_DEBUG( 3819 dbgs() << "BOLT: mapping original section " << SectionName << " (0x" 3820 << Twine::utohexstr(OrgSection->getAllocAddress()) << ") to 0x" 3821 << Twine::utohexstr(Section.getAddress()) << '\n'); 3822 3823 RTDyld.reassignSectionAddress(OrgSection->getSectionID(), 3824 Section.getAddress()); 3825 3826 OrgSection->setOutputAddress(Section.getAddress()); 3827 OrgSection->setOutputFileOffset(Section.getContents().data() - 3828 InputFile->getData().data()); 3829 } 3830 } 3831 3832 void RewriteInstance::mapExtraSections(RuntimeDyld &RTDyld) { 3833 for (BinarySection &Section : BC->allocatableSections()) { 3834 if (Section.getOutputAddress() || !Section.hasValidSectionID()) 3835 continue; 3836 NextAvailableAddress = 3837 alignTo(NextAvailableAddress, Section.getAlignment()); 3838 Section.setOutputAddress(NextAvailableAddress); 3839 NextAvailableAddress += Section.getOutputSize(); 3840 3841 LLVM_DEBUG(dbgs() << "BOLT: (extra) mapping " << Section.getName() 3842 << " at 0x" << Twine::utohexstr(Section.getAllocAddress()) 3843 << " to 0x" 3844 << Twine::utohexstr(Section.getOutputAddress()) << '\n'); 3845 3846 RTDyld.reassignSectionAddress(Section.getSectionID(), 3847 Section.getOutputAddress()); 3848 Section.setOutputFileOffset( 3849 getFileOffsetForAddress(Section.getOutputAddress())); 3850 } 3851 } 3852 3853 void RewriteInstance::updateOutputValues(const MCAsmLayout &Layout) { 3854 for (BinaryFunction *Function : BC->getAllBinaryFunctions()) 3855 Function->updateOutputValues(Layout); 3856 } 3857 3858 void RewriteInstance::patchELFPHDRTable() { 3859 auto ELF64LEFile = dyn_cast<ELF64LEObjectFile>(InputFile); 3860 if (!ELF64LEFile) { 3861 errs() << "BOLT-ERROR: only 64-bit LE ELF binaries are supported\n"; 3862 exit(1); 3863 } 3864 const ELFFile<ELF64LE> &Obj = ELF64LEFile->getELFFile(); 3865 raw_fd_ostream &OS = Out->os(); 3866 3867 // Write/re-write program headers. 3868 Phnum = Obj.getHeader().e_phnum; 3869 if (PHDRTableOffset) { 3870 // Writing new pheader table. 3871 Phnum += 1; // only adding one new segment 3872 // Segment size includes the size of the PHDR area. 3873 NewTextSegmentSize = NextAvailableAddress - PHDRTableAddress; 3874 } else { 3875 assert(!PHDRTableAddress && "unexpected address for program header table"); 3876 // Update existing table. 3877 PHDRTableOffset = Obj.getHeader().e_phoff; 3878 NewTextSegmentSize = NextAvailableAddress - NewTextSegmentAddress; 3879 } 3880 OS.seek(PHDRTableOffset); 3881 3882 bool ModdedGnuStack = false; 3883 (void)ModdedGnuStack; 3884 bool AddedSegment = false; 3885 (void)AddedSegment; 3886 3887 auto createNewTextPhdr = [&]() { 3888 ELF64LEPhdrTy NewPhdr; 3889 NewPhdr.p_type = ELF::PT_LOAD; 3890 if (PHDRTableAddress) { 3891 NewPhdr.p_offset = PHDRTableOffset; 3892 NewPhdr.p_vaddr = PHDRTableAddress; 3893 NewPhdr.p_paddr = PHDRTableAddress; 3894 } else { 3895 NewPhdr.p_offset = NewTextSegmentOffset; 3896 NewPhdr.p_vaddr = NewTextSegmentAddress; 3897 NewPhdr.p_paddr = NewTextSegmentAddress; 3898 } 3899 NewPhdr.p_filesz = NewTextSegmentSize; 3900 NewPhdr.p_memsz = NewTextSegmentSize; 3901 NewPhdr.p_flags = ELF::PF_X | ELF::PF_R; 3902 // FIXME: Currently instrumentation is experimental and the runtime data 3903 // is emitted with code, thus everything needs to be writable 3904 if (opts::Instrument) 3905 NewPhdr.p_flags |= ELF::PF_W; 3906 NewPhdr.p_align = BC->PageAlign; 3907 3908 return NewPhdr; 3909 }; 3910 3911 // Copy existing program headers with modifications. 3912 for (const ELF64LE::Phdr &Phdr : cantFail(Obj.program_headers())) { 3913 ELF64LE::Phdr NewPhdr = Phdr; 3914 if (PHDRTableAddress && Phdr.p_type == ELF::PT_PHDR) { 3915 NewPhdr.p_offset = PHDRTableOffset; 3916 NewPhdr.p_vaddr = PHDRTableAddress; 3917 NewPhdr.p_paddr = PHDRTableAddress; 3918 NewPhdr.p_filesz = sizeof(NewPhdr) * Phnum; 3919 NewPhdr.p_memsz = sizeof(NewPhdr) * Phnum; 3920 } else if (Phdr.p_type == ELF::PT_GNU_EH_FRAME) { 3921 ErrorOr<BinarySection &> EHFrameHdrSec = 3922 BC->getUniqueSectionByName(".eh_frame_hdr"); 3923 if (EHFrameHdrSec && EHFrameHdrSec->isAllocatable() && 3924 EHFrameHdrSec->isFinalized()) { 3925 NewPhdr.p_offset = EHFrameHdrSec->getOutputFileOffset(); 3926 NewPhdr.p_vaddr = EHFrameHdrSec->getOutputAddress(); 3927 NewPhdr.p_paddr = EHFrameHdrSec->getOutputAddress(); 3928 NewPhdr.p_filesz = EHFrameHdrSec->getOutputSize(); 3929 NewPhdr.p_memsz = EHFrameHdrSec->getOutputSize(); 3930 } 3931 } else if (opts::UseGnuStack && Phdr.p_type == ELF::PT_GNU_STACK) { 3932 NewPhdr = createNewTextPhdr(); 3933 ModdedGnuStack = true; 3934 } else if (!opts::UseGnuStack && Phdr.p_type == ELF::PT_DYNAMIC) { 3935 // Insert the new header before DYNAMIC. 3936 ELF64LE::Phdr NewTextPhdr = createNewTextPhdr(); 3937 OS.write(reinterpret_cast<const char *>(&NewTextPhdr), 3938 sizeof(NewTextPhdr)); 3939 AddedSegment = true; 3940 } 3941 OS.write(reinterpret_cast<const char *>(&NewPhdr), sizeof(NewPhdr)); 3942 } 3943 3944 if (!opts::UseGnuStack && !AddedSegment) { 3945 // Append the new header to the end of the table. 3946 ELF64LE::Phdr NewTextPhdr = createNewTextPhdr(); 3947 OS.write(reinterpret_cast<const char *>(&NewTextPhdr), sizeof(NewTextPhdr)); 3948 } 3949 3950 assert((!opts::UseGnuStack || ModdedGnuStack) && 3951 "could not find GNU_STACK program header to modify"); 3952 } 3953 3954 namespace { 3955 3956 /// Write padding to \p OS such that its current \p Offset becomes aligned 3957 /// at \p Alignment. Return new (aligned) offset. 3958 uint64_t appendPadding(raw_pwrite_stream &OS, uint64_t Offset, 3959 uint64_t Alignment) { 3960 if (!Alignment) 3961 return Offset; 3962 3963 const uint64_t PaddingSize = 3964 offsetToAlignment(Offset, llvm::Align(Alignment)); 3965 for (unsigned I = 0; I < PaddingSize; ++I) 3966 OS.write((unsigned char)0); 3967 return Offset + PaddingSize; 3968 } 3969 3970 } 3971 3972 void RewriteInstance::rewriteNoteSections() { 3973 auto ELF64LEFile = dyn_cast<ELF64LEObjectFile>(InputFile); 3974 if (!ELF64LEFile) { 3975 errs() << "BOLT-ERROR: only 64-bit LE ELF binaries are supported\n"; 3976 exit(1); 3977 } 3978 const ELFFile<ELF64LE> &Obj = ELF64LEFile->getELFFile(); 3979 raw_fd_ostream &OS = Out->os(); 3980 3981 uint64_t NextAvailableOffset = getFileOffsetForAddress(NextAvailableAddress); 3982 assert(NextAvailableOffset >= FirstNonAllocatableOffset && 3983 "next available offset calculation failure"); 3984 OS.seek(NextAvailableOffset); 3985 3986 // Copy over non-allocatable section contents and update file offsets. 3987 for (const ELF64LE::Shdr &Section : cantFail(Obj.sections())) { 3988 if (Section.sh_type == ELF::SHT_NULL) 3989 continue; 3990 if (Section.sh_flags & ELF::SHF_ALLOC) 3991 continue; 3992 3993 StringRef SectionName = 3994 cantFail(Obj.getSectionName(Section), "cannot get section name"); 3995 ErrorOr<BinarySection &> BSec = BC->getUniqueSectionByName(SectionName); 3996 3997 if (shouldStrip(Section, SectionName)) 3998 continue; 3999 4000 // Insert padding as needed. 4001 NextAvailableOffset = 4002 appendPadding(OS, NextAvailableOffset, Section.sh_addralign); 4003 4004 // New section size. 4005 uint64_t Size = 0; 4006 bool DataWritten = false; 4007 uint8_t *SectionData = nullptr; 4008 // Copy over section contents unless it's one of the sections we overwrite. 4009 if (!willOverwriteSection(SectionName)) { 4010 Size = Section.sh_size; 4011 StringRef Dataref = InputFile->getData().substr(Section.sh_offset, Size); 4012 std::string Data; 4013 if (BSec && BSec->getPatcher()) { 4014 Data = BSec->getPatcher()->patchBinary(Dataref); 4015 Dataref = StringRef(Data); 4016 } 4017 4018 // Section was expanded, so need to treat it as overwrite. 4019 if (Size != Dataref.size()) { 4020 BSec = BC->registerOrUpdateNoteSection( 4021 SectionName, copyByteArray(Dataref), Dataref.size()); 4022 Size = 0; 4023 } else { 4024 OS << Dataref; 4025 DataWritten = true; 4026 4027 // Add padding as the section extension might rely on the alignment. 4028 Size = appendPadding(OS, Size, Section.sh_addralign); 4029 } 4030 } 4031 4032 // Perform section post-processing. 4033 if (BSec && !BSec->isAllocatable()) { 4034 assert(BSec->getAlignment() <= Section.sh_addralign && 4035 "alignment exceeds value in file"); 4036 4037 if (BSec->getAllocAddress()) { 4038 assert(!DataWritten && "Writing section twice."); 4039 SectionData = BSec->getOutputData(); 4040 4041 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: " << (Size ? "appending" : "writing") 4042 << " contents to section " << SectionName << '\n'); 4043 OS.write(reinterpret_cast<char *>(SectionData), BSec->getOutputSize()); 4044 Size += BSec->getOutputSize(); 4045 } 4046 4047 BSec->setOutputFileOffset(NextAvailableOffset); 4048 BSec->flushPendingRelocations(OS, 4049 [this] (const MCSymbol *S) { 4050 return getNewValueForSymbol(S->getName()); 4051 }); 4052 } 4053 4054 // Set/modify section info. 4055 BinarySection &NewSection = 4056 BC->registerOrUpdateNoteSection(SectionName, 4057 SectionData, 4058 Size, 4059 Section.sh_addralign, 4060 BSec ? BSec->isReadOnly() : false, 4061 BSec ? BSec->getELFType() 4062 : ELF::SHT_PROGBITS); 4063 NewSection.setOutputAddress(0); 4064 NewSection.setOutputFileOffset(NextAvailableOffset); 4065 4066 NextAvailableOffset += Size; 4067 } 4068 4069 // Write new note sections. 4070 for (BinarySection &Section : BC->nonAllocatableSections()) { 4071 if (Section.getOutputFileOffset() || !Section.getAllocAddress()) 4072 continue; 4073 4074 assert(!Section.hasPendingRelocations() && "cannot have pending relocs"); 4075 4076 NextAvailableOffset = 4077 appendPadding(OS, NextAvailableOffset, Section.getAlignment()); 4078 Section.setOutputFileOffset(NextAvailableOffset); 4079 4080 LLVM_DEBUG( 4081 dbgs() << "BOLT-DEBUG: writing out new section " << Section.getName() 4082 << " of size " << Section.getOutputSize() << " at offset 0x" 4083 << Twine::utohexstr(Section.getOutputFileOffset()) << '\n'); 4084 4085 OS.write(Section.getOutputContents().data(), Section.getOutputSize()); 4086 NextAvailableOffset += Section.getOutputSize(); 4087 } 4088 } 4089 4090 template <typename ELFT> 4091 void RewriteInstance::finalizeSectionStringTable(ELFObjectFile<ELFT> *File) { 4092 using ELFShdrTy = typename ELFT::Shdr; 4093 const ELFFile<ELFT> &Obj = File->getELFFile(); 4094 4095 // Pre-populate section header string table. 4096 for (const ELFShdrTy &Section : cantFail(Obj.sections())) { 4097 StringRef SectionName = 4098 cantFail(Obj.getSectionName(Section), "cannot get section name"); 4099 SHStrTab.add(SectionName); 4100 std::string OutputSectionName = getOutputSectionName(Obj, Section); 4101 if (OutputSectionName != SectionName) 4102 SHStrTabPool.emplace_back(std::move(OutputSectionName)); 4103 } 4104 for (const std::string &Str : SHStrTabPool) 4105 SHStrTab.add(Str); 4106 for (const BinarySection &Section : BC->sections()) 4107 SHStrTab.add(Section.getName()); 4108 SHStrTab.finalize(); 4109 4110 const size_t SHStrTabSize = SHStrTab.getSize(); 4111 uint8_t *DataCopy = new uint8_t[SHStrTabSize]; 4112 memset(DataCopy, 0, SHStrTabSize); 4113 SHStrTab.write(DataCopy); 4114 BC->registerOrUpdateNoteSection(".shstrtab", 4115 DataCopy, 4116 SHStrTabSize, 4117 /*Alignment=*/1, 4118 /*IsReadOnly=*/true, 4119 ELF::SHT_STRTAB); 4120 } 4121 4122 void RewriteInstance::addBoltInfoSection() { 4123 std::string DescStr; 4124 raw_string_ostream DescOS(DescStr); 4125 4126 DescOS << "BOLT revision: " << BoltRevision << ", " 4127 << "command line:"; 4128 for (int I = 0; I < Argc; ++I) 4129 DescOS << " " << Argv[I]; 4130 DescOS.flush(); 4131 4132 // Encode as GNU GOLD VERSION so it is easily printable by 'readelf -n' 4133 const std::string BoltInfo = 4134 BinarySection::encodeELFNote("GNU", DescStr, 4 /*NT_GNU_GOLD_VERSION*/); 4135 BC->registerOrUpdateNoteSection(".note.bolt_info", copyByteArray(BoltInfo), 4136 BoltInfo.size(), 4137 /*Alignment=*/1, 4138 /*IsReadOnly=*/true, ELF::SHT_NOTE); 4139 } 4140 4141 void RewriteInstance::addBATSection() { 4142 BC->registerOrUpdateNoteSection(BoltAddressTranslation::SECTION_NAME, nullptr, 4143 0, 4144 /*Alignment=*/1, 4145 /*IsReadOnly=*/true, ELF::SHT_NOTE); 4146 } 4147 4148 void RewriteInstance::encodeBATSection() { 4149 std::string DescStr; 4150 raw_string_ostream DescOS(DescStr); 4151 4152 BAT->write(DescOS); 4153 DescOS.flush(); 4154 4155 const std::string BoltInfo = 4156 BinarySection::encodeELFNote("BOLT", DescStr, BinarySection::NT_BOLT_BAT); 4157 BC->registerOrUpdateNoteSection(BoltAddressTranslation::SECTION_NAME, 4158 copyByteArray(BoltInfo), BoltInfo.size(), 4159 /*Alignment=*/1, 4160 /*IsReadOnly=*/true, ELF::SHT_NOTE); 4161 } 4162 4163 template <typename ELFObjType, typename ELFShdrTy> 4164 std::string RewriteInstance::getOutputSectionName(const ELFObjType &Obj, 4165 const ELFShdrTy &Section) { 4166 if (Section.sh_type == ELF::SHT_NULL) 4167 return ""; 4168 4169 StringRef SectionName = 4170 cantFail(Obj.getSectionName(Section), "cannot get section name"); 4171 4172 if ((Section.sh_flags & ELF::SHF_ALLOC) && willOverwriteSection(SectionName)) 4173 return (getOrgSecPrefix() + SectionName).str(); 4174 4175 return std::string(SectionName); 4176 } 4177 4178 template <typename ELFShdrTy> 4179 bool RewriteInstance::shouldStrip(const ELFShdrTy &Section, 4180 StringRef SectionName) { 4181 // Strip non-allocatable relocation sections. 4182 if (!(Section.sh_flags & ELF::SHF_ALLOC) && Section.sh_type == ELF::SHT_RELA) 4183 return true; 4184 4185 // Strip debug sections if not updating them. 4186 if (isDebugSection(SectionName) && !opts::UpdateDebugSections) 4187 return true; 4188 4189 // Strip symtab section if needed 4190 if (opts::RemoveSymtab && Section.sh_type == ELF::SHT_SYMTAB) 4191 return true; 4192 4193 return false; 4194 } 4195 4196 template <typename ELFT> 4197 std::vector<typename object::ELFObjectFile<ELFT>::Elf_Shdr> 4198 RewriteInstance::getOutputSections(ELFObjectFile<ELFT> *File, 4199 std::vector<uint32_t> &NewSectionIndex) { 4200 using ELFShdrTy = typename ELFObjectFile<ELFT>::Elf_Shdr; 4201 const ELFFile<ELFT> &Obj = File->getELFFile(); 4202 typename ELFT::ShdrRange Sections = cantFail(Obj.sections()); 4203 4204 // Keep track of section header entries together with their name. 4205 std::vector<std::pair<std::string, ELFShdrTy>> OutputSections; 4206 auto addSection = [&](const std::string &Name, const ELFShdrTy &Section) { 4207 ELFShdrTy NewSection = Section; 4208 NewSection.sh_name = SHStrTab.getOffset(Name); 4209 OutputSections.emplace_back(Name, std::move(NewSection)); 4210 }; 4211 4212 // Copy over entries for original allocatable sections using modified name. 4213 for (const ELFShdrTy &Section : Sections) { 4214 // Always ignore this section. 4215 if (Section.sh_type == ELF::SHT_NULL) { 4216 OutputSections.emplace_back("", Section); 4217 continue; 4218 } 4219 4220 if (!(Section.sh_flags & ELF::SHF_ALLOC)) 4221 continue; 4222 4223 addSection(getOutputSectionName(Obj, Section), Section); 4224 } 4225 4226 for (const BinarySection &Section : BC->allocatableSections()) { 4227 if (!Section.isFinalized()) 4228 continue; 4229 4230 if (Section.getName().startswith(getOrgSecPrefix()) || 4231 Section.isAnonymous()) { 4232 if (opts::Verbosity) 4233 outs() << "BOLT-INFO: not writing section header for section " 4234 << Section.getName() << '\n'; 4235 continue; 4236 } 4237 4238 if (opts::Verbosity >= 1) 4239 outs() << "BOLT-INFO: writing section header for " << Section.getName() 4240 << '\n'; 4241 ELFShdrTy NewSection; 4242 NewSection.sh_type = ELF::SHT_PROGBITS; 4243 NewSection.sh_addr = Section.getOutputAddress(); 4244 NewSection.sh_offset = Section.getOutputFileOffset(); 4245 NewSection.sh_size = Section.getOutputSize(); 4246 NewSection.sh_entsize = 0; 4247 NewSection.sh_flags = Section.getELFFlags(); 4248 NewSection.sh_link = 0; 4249 NewSection.sh_info = 0; 4250 NewSection.sh_addralign = Section.getAlignment(); 4251 addSection(std::string(Section.getName()), NewSection); 4252 } 4253 4254 // Sort all allocatable sections by their offset. 4255 std::stable_sort(OutputSections.begin(), OutputSections.end(), 4256 [] (const std::pair<std::string, ELFShdrTy> &A, 4257 const std::pair<std::string, ELFShdrTy> &B) { 4258 return A.second.sh_offset < B.second.sh_offset; 4259 }); 4260 4261 // Fix section sizes to prevent overlapping. 4262 ELFShdrTy *PrevSection = nullptr; 4263 StringRef PrevSectionName; 4264 for (auto &SectionKV : OutputSections) { 4265 ELFShdrTy &Section = SectionKV.second; 4266 4267 // TBSS section does not take file or memory space. Ignore it for layout 4268 // purposes. 4269 if (Section.sh_type == ELF::SHT_NOBITS && (Section.sh_flags & ELF::SHF_TLS)) 4270 continue; 4271 4272 if (PrevSection && 4273 PrevSection->sh_addr + PrevSection->sh_size > Section.sh_addr) { 4274 if (opts::Verbosity > 1) 4275 outs() << "BOLT-INFO: adjusting size for section " << PrevSectionName 4276 << '\n'; 4277 PrevSection->sh_size = Section.sh_addr > PrevSection->sh_addr 4278 ? Section.sh_addr - PrevSection->sh_addr 4279 : 0; 4280 } 4281 4282 PrevSection = &Section; 4283 PrevSectionName = SectionKV.first; 4284 } 4285 4286 uint64_t LastFileOffset = 0; 4287 4288 // Copy over entries for non-allocatable sections performing necessary 4289 // adjustments. 4290 for (const ELFShdrTy &Section : Sections) { 4291 if (Section.sh_type == ELF::SHT_NULL) 4292 continue; 4293 if (Section.sh_flags & ELF::SHF_ALLOC) 4294 continue; 4295 4296 StringRef SectionName = 4297 cantFail(Obj.getSectionName(Section), "cannot get section name"); 4298 4299 if (shouldStrip(Section, SectionName)) 4300 continue; 4301 4302 ErrorOr<BinarySection &> BSec = BC->getUniqueSectionByName(SectionName); 4303 assert(BSec && "missing section info for non-allocatable section"); 4304 4305 ELFShdrTy NewSection = Section; 4306 NewSection.sh_offset = BSec->getOutputFileOffset(); 4307 NewSection.sh_size = BSec->getOutputSize(); 4308 4309 if (NewSection.sh_type == ELF::SHT_SYMTAB) 4310 NewSection.sh_info = NumLocalSymbols; 4311 4312 addSection(std::string(SectionName), NewSection); 4313 4314 LastFileOffset = BSec->getOutputFileOffset(); 4315 } 4316 4317 // Create entries for new non-allocatable sections. 4318 for (BinarySection &Section : BC->nonAllocatableSections()) { 4319 if (Section.getOutputFileOffset() <= LastFileOffset) 4320 continue; 4321 4322 if (opts::Verbosity >= 1) 4323 outs() << "BOLT-INFO: writing section header for " << Section.getName() 4324 << '\n'; 4325 4326 ELFShdrTy NewSection; 4327 NewSection.sh_type = Section.getELFType(); 4328 NewSection.sh_addr = 0; 4329 NewSection.sh_offset = Section.getOutputFileOffset(); 4330 NewSection.sh_size = Section.getOutputSize(); 4331 NewSection.sh_entsize = 0; 4332 NewSection.sh_flags = Section.getELFFlags(); 4333 NewSection.sh_link = 0; 4334 NewSection.sh_info = 0; 4335 NewSection.sh_addralign = Section.getAlignment(); 4336 4337 addSection(std::string(Section.getName()), NewSection); 4338 } 4339 4340 // Assign indices to sections. 4341 std::unordered_map<std::string, uint64_t> NameToIndex; 4342 for (uint32_t Index = 1; Index < OutputSections.size(); ++Index) { 4343 const std::string &SectionName = OutputSections[Index].first; 4344 NameToIndex[SectionName] = Index; 4345 if (ErrorOr<BinarySection &> Section = 4346 BC->getUniqueSectionByName(SectionName)) 4347 Section->setIndex(Index); 4348 } 4349 4350 // Update section index mapping 4351 NewSectionIndex.clear(); 4352 NewSectionIndex.resize(Sections.size(), 0); 4353 for (const ELFShdrTy &Section : Sections) { 4354 if (Section.sh_type == ELF::SHT_NULL) 4355 continue; 4356 4357 size_t OrgIndex = std::distance(Sections.begin(), &Section); 4358 std::string SectionName = getOutputSectionName(Obj, Section); 4359 4360 // Some sections are stripped 4361 if (!NameToIndex.count(SectionName)) 4362 continue; 4363 4364 NewSectionIndex[OrgIndex] = NameToIndex[SectionName]; 4365 } 4366 4367 std::vector<ELFShdrTy> SectionsOnly(OutputSections.size()); 4368 std::transform(OutputSections.begin(), OutputSections.end(), 4369 SectionsOnly.begin(), 4370 [](std::pair<std::string, ELFShdrTy> &SectionInfo) { 4371 return SectionInfo.second; 4372 }); 4373 4374 return SectionsOnly; 4375 } 4376 4377 // Rewrite section header table inserting new entries as needed. The sections 4378 // header table size itself may affect the offsets of other sections, 4379 // so we are placing it at the end of the binary. 4380 // 4381 // As we rewrite entries we need to track how many sections were inserted 4382 // as it changes the sh_link value. We map old indices to new ones for 4383 // existing sections. 4384 template <typename ELFT> 4385 void RewriteInstance::patchELFSectionHeaderTable(ELFObjectFile<ELFT> *File) { 4386 using ELFShdrTy = typename ELFObjectFile<ELFT>::Elf_Shdr; 4387 using ELFEhdrTy = typename ELFObjectFile<ELFT>::Elf_Ehdr; 4388 raw_fd_ostream &OS = Out->os(); 4389 const ELFFile<ELFT> &Obj = File->getELFFile(); 4390 4391 std::vector<uint32_t> NewSectionIndex; 4392 std::vector<ELFShdrTy> OutputSections = 4393 getOutputSections(File, NewSectionIndex); 4394 LLVM_DEBUG( 4395 dbgs() << "BOLT-DEBUG: old to new section index mapping:\n"; 4396 for (uint64_t I = 0; I < NewSectionIndex.size(); ++I) 4397 dbgs() << " " << I << " -> " << NewSectionIndex[I] << '\n'; 4398 ); 4399 4400 // Align starting address for section header table. 4401 uint64_t SHTOffset = OS.tell(); 4402 SHTOffset = appendPadding(OS, SHTOffset, sizeof(ELFShdrTy)); 4403 4404 // Write all section header entries while patching section references. 4405 for (ELFShdrTy &Section : OutputSections) { 4406 Section.sh_link = NewSectionIndex[Section.sh_link]; 4407 if (Section.sh_type == ELF::SHT_REL || Section.sh_type == ELF::SHT_RELA) { 4408 if (Section.sh_info) 4409 Section.sh_info = NewSectionIndex[Section.sh_info]; 4410 } 4411 OS.write(reinterpret_cast<const char *>(&Section), sizeof(Section)); 4412 } 4413 4414 // Fix ELF header. 4415 ELFEhdrTy NewEhdr = Obj.getHeader(); 4416 4417 if (BC->HasRelocations) { 4418 if (RuntimeLibrary *RtLibrary = BC->getRuntimeLibrary()) 4419 NewEhdr.e_entry = RtLibrary->getRuntimeStartAddress(); 4420 else 4421 NewEhdr.e_entry = getNewFunctionAddress(NewEhdr.e_entry); 4422 assert((NewEhdr.e_entry || !Obj.getHeader().e_entry) && 4423 "cannot find new address for entry point"); 4424 } 4425 NewEhdr.e_phoff = PHDRTableOffset; 4426 NewEhdr.e_phnum = Phnum; 4427 NewEhdr.e_shoff = SHTOffset; 4428 NewEhdr.e_shnum = OutputSections.size(); 4429 NewEhdr.e_shstrndx = NewSectionIndex[NewEhdr.e_shstrndx]; 4430 OS.pwrite(reinterpret_cast<const char *>(&NewEhdr), sizeof(NewEhdr), 0); 4431 } 4432 4433 template <typename ELFT, typename WriteFuncTy, typename StrTabFuncTy> 4434 void RewriteInstance::updateELFSymbolTable( 4435 ELFObjectFile<ELFT> *File, bool IsDynSym, 4436 const typename object::ELFObjectFile<ELFT>::Elf_Shdr &SymTabSection, 4437 const std::vector<uint32_t> &NewSectionIndex, WriteFuncTy Write, 4438 StrTabFuncTy AddToStrTab) { 4439 const ELFFile<ELFT> &Obj = File->getELFFile(); 4440 using ELFSymTy = typename ELFObjectFile<ELFT>::Elf_Sym; 4441 4442 StringRef StringSection = 4443 cantFail(Obj.getStringTableForSymtab(SymTabSection)); 4444 4445 unsigned NumHotTextSymsUpdated = 0; 4446 unsigned NumHotDataSymsUpdated = 0; 4447 4448 std::map<const BinaryFunction *, uint64_t> IslandSizes; 4449 auto getConstantIslandSize = [&IslandSizes](const BinaryFunction &BF) { 4450 auto Itr = IslandSizes.find(&BF); 4451 if (Itr != IslandSizes.end()) 4452 return Itr->second; 4453 return IslandSizes[&BF] = BF.estimateConstantIslandSize(); 4454 }; 4455 4456 // Symbols for the new symbol table. 4457 std::vector<ELFSymTy> Symbols; 4458 4459 auto getNewSectionIndex = [&](uint32_t OldIndex) { 4460 assert(OldIndex < NewSectionIndex.size() && "section index out of bounds"); 4461 const uint32_t NewIndex = NewSectionIndex[OldIndex]; 4462 4463 // We may have stripped the section that dynsym was referencing due to 4464 // the linker bug. In that case return the old index avoiding marking 4465 // the symbol as undefined. 4466 if (IsDynSym && NewIndex != OldIndex && NewIndex == ELF::SHN_UNDEF) 4467 return OldIndex; 4468 return NewIndex; 4469 }; 4470 4471 // Add extra symbols for the function. 4472 // 4473 // Note that addExtraSymbols() could be called multiple times for the same 4474 // function with different FunctionSymbol matching the main function entry 4475 // point. 4476 auto addExtraSymbols = [&](const BinaryFunction &Function, 4477 const ELFSymTy &FunctionSymbol) { 4478 if (Function.isFolded()) { 4479 BinaryFunction *ICFParent = Function.getFoldedIntoFunction(); 4480 while (ICFParent->isFolded()) 4481 ICFParent = ICFParent->getFoldedIntoFunction(); 4482 ELFSymTy ICFSymbol = FunctionSymbol; 4483 SmallVector<char, 256> Buf; 4484 ICFSymbol.st_name = 4485 AddToStrTab(Twine(cantFail(FunctionSymbol.getName(StringSection))) 4486 .concat(".icf.0") 4487 .toStringRef(Buf)); 4488 ICFSymbol.st_value = ICFParent->getOutputAddress(); 4489 ICFSymbol.st_size = ICFParent->getOutputSize(); 4490 ICFSymbol.st_shndx = ICFParent->getCodeSection()->getIndex(); 4491 Symbols.emplace_back(ICFSymbol); 4492 } 4493 if (Function.isSplit() && Function.cold().getAddress()) { 4494 ELFSymTy NewColdSym = FunctionSymbol; 4495 SmallVector<char, 256> Buf; 4496 NewColdSym.st_name = 4497 AddToStrTab(Twine(cantFail(FunctionSymbol.getName(StringSection))) 4498 .concat(".cold.0") 4499 .toStringRef(Buf)); 4500 NewColdSym.st_shndx = Function.getColdCodeSection()->getIndex(); 4501 NewColdSym.st_value = Function.cold().getAddress(); 4502 NewColdSym.st_size = Function.cold().getImageSize(); 4503 NewColdSym.setBindingAndType(ELF::STB_LOCAL, ELF::STT_FUNC); 4504 Symbols.emplace_back(NewColdSym); 4505 } 4506 if (Function.hasConstantIsland()) { 4507 uint64_t DataMark = Function.getOutputDataAddress(); 4508 uint64_t CISize = getConstantIslandSize(Function); 4509 uint64_t CodeMark = DataMark + CISize; 4510 ELFSymTy DataMarkSym = FunctionSymbol; 4511 DataMarkSym.st_name = AddToStrTab("$d"); 4512 DataMarkSym.st_value = DataMark; 4513 DataMarkSym.st_size = 0; 4514 DataMarkSym.setType(ELF::STT_NOTYPE); 4515 DataMarkSym.setBinding(ELF::STB_LOCAL); 4516 ELFSymTy CodeMarkSym = DataMarkSym; 4517 CodeMarkSym.st_name = AddToStrTab("$x"); 4518 CodeMarkSym.st_value = CodeMark; 4519 Symbols.emplace_back(DataMarkSym); 4520 Symbols.emplace_back(CodeMarkSym); 4521 } 4522 if (Function.hasConstantIsland() && Function.isSplit()) { 4523 uint64_t DataMark = Function.getOutputColdDataAddress(); 4524 uint64_t CISize = getConstantIslandSize(Function); 4525 uint64_t CodeMark = DataMark + CISize; 4526 ELFSymTy DataMarkSym = FunctionSymbol; 4527 DataMarkSym.st_name = AddToStrTab("$d"); 4528 DataMarkSym.st_value = DataMark; 4529 DataMarkSym.st_size = 0; 4530 DataMarkSym.setType(ELF::STT_NOTYPE); 4531 DataMarkSym.setBinding(ELF::STB_LOCAL); 4532 ELFSymTy CodeMarkSym = DataMarkSym; 4533 CodeMarkSym.st_name = AddToStrTab("$x"); 4534 CodeMarkSym.st_value = CodeMark; 4535 Symbols.emplace_back(DataMarkSym); 4536 Symbols.emplace_back(CodeMarkSym); 4537 } 4538 }; 4539 4540 // For regular (non-dynamic) symbol table, exclude symbols referring 4541 // to non-allocatable sections. 4542 auto shouldStrip = [&](const ELFSymTy &Symbol) { 4543 if (Symbol.isAbsolute() || !Symbol.isDefined()) 4544 return false; 4545 4546 // If we cannot link the symbol to a section, leave it as is. 4547 Expected<const typename ELFT::Shdr *> Section = 4548 Obj.getSection(Symbol.st_shndx); 4549 if (!Section) 4550 return false; 4551 4552 // Remove the section symbol iif the corresponding section was stripped. 4553 if (Symbol.getType() == ELF::STT_SECTION) { 4554 if (!getNewSectionIndex(Symbol.st_shndx)) 4555 return true; 4556 return false; 4557 } 4558 4559 // Symbols in non-allocatable sections are typically remnants of relocations 4560 // emitted under "-emit-relocs" linker option. Delete those as we delete 4561 // relocations against non-allocatable sections. 4562 if (!((*Section)->sh_flags & ELF::SHF_ALLOC)) 4563 return true; 4564 4565 return false; 4566 }; 4567 4568 for (const ELFSymTy &Symbol : cantFail(Obj.symbols(&SymTabSection))) { 4569 // For regular (non-dynamic) symbol table strip unneeded symbols. 4570 if (!IsDynSym && shouldStrip(Symbol)) 4571 continue; 4572 4573 const BinaryFunction *Function = 4574 BC->getBinaryFunctionAtAddress(Symbol.st_value); 4575 // Ignore false function references, e.g. when the section address matches 4576 // the address of the function. 4577 if (Function && Symbol.getType() == ELF::STT_SECTION) 4578 Function = nullptr; 4579 4580 // For non-dynamic symtab, make sure the symbol section matches that of 4581 // the function. It can mismatch e.g. if the symbol is a section marker 4582 // in which case we treat the symbol separately from the function. 4583 // For dynamic symbol table, the section index could be wrong on the input, 4584 // and its value is ignored by the runtime if it's different from 4585 // SHN_UNDEF and SHN_ABS. 4586 if (!IsDynSym && Function && 4587 Symbol.st_shndx != 4588 Function->getOriginSection()->getSectionRef().getIndex()) 4589 Function = nullptr; 4590 4591 // Create a new symbol based on the existing symbol. 4592 ELFSymTy NewSymbol = Symbol; 4593 4594 if (Function) { 4595 // If the symbol matched a function that was not emitted, update the 4596 // corresponding section index but otherwise leave it unchanged. 4597 if (Function->isEmitted()) { 4598 NewSymbol.st_value = Function->getOutputAddress(); 4599 NewSymbol.st_size = Function->getOutputSize(); 4600 NewSymbol.st_shndx = Function->getCodeSection()->getIndex(); 4601 } else if (Symbol.st_shndx < ELF::SHN_LORESERVE) { 4602 NewSymbol.st_shndx = getNewSectionIndex(Symbol.st_shndx); 4603 } 4604 4605 // Add new symbols to the symbol table if necessary. 4606 if (!IsDynSym) 4607 addExtraSymbols(*Function, NewSymbol); 4608 } else { 4609 // Check if the function symbol matches address inside a function, i.e. 4610 // it marks a secondary entry point. 4611 Function = 4612 (Symbol.getType() == ELF::STT_FUNC) 4613 ? BC->getBinaryFunctionContainingAddress(Symbol.st_value, 4614 /*CheckPastEnd=*/false, 4615 /*UseMaxSize=*/true) 4616 : nullptr; 4617 4618 if (Function && Function->isEmitted()) { 4619 const uint64_t OutputAddress = 4620 Function->translateInputToOutputAddress(Symbol.st_value); 4621 4622 NewSymbol.st_value = OutputAddress; 4623 // Force secondary entry points to have zero size. 4624 NewSymbol.st_size = 0; 4625 NewSymbol.st_shndx = 4626 OutputAddress >= Function->cold().getAddress() && 4627 OutputAddress < Function->cold().getImageSize() 4628 ? Function->getColdCodeSection()->getIndex() 4629 : Function->getCodeSection()->getIndex(); 4630 } else { 4631 // Check if the symbol belongs to moved data object and update it. 4632 BinaryData *BD = opts::ReorderData.empty() 4633 ? nullptr 4634 : BC->getBinaryDataAtAddress(Symbol.st_value); 4635 if (BD && BD->isMoved() && !BD->isJumpTable()) { 4636 assert((!BD->getSize() || !Symbol.st_size || 4637 Symbol.st_size == BD->getSize()) && 4638 "sizes must match"); 4639 4640 BinarySection &OutputSection = BD->getOutputSection(); 4641 assert(OutputSection.getIndex()); 4642 LLVM_DEBUG(dbgs() 4643 << "BOLT-DEBUG: moving " << BD->getName() << " from " 4644 << *BC->getSectionNameForAddress(Symbol.st_value) << " (" 4645 << Symbol.st_shndx << ") to " << OutputSection.getName() 4646 << " (" << OutputSection.getIndex() << ")\n"); 4647 NewSymbol.st_shndx = OutputSection.getIndex(); 4648 NewSymbol.st_value = BD->getOutputAddress(); 4649 } else { 4650 // Otherwise just update the section for the symbol. 4651 if (Symbol.st_shndx < ELF::SHN_LORESERVE) 4652 NewSymbol.st_shndx = getNewSectionIndex(Symbol.st_shndx); 4653 } 4654 4655 // Detect local syms in the text section that we didn't update 4656 // and that were preserved by the linker to support relocations against 4657 // .text. Remove them from the symtab. 4658 if (Symbol.getType() == ELF::STT_NOTYPE && 4659 Symbol.getBinding() == ELF::STB_LOCAL && Symbol.st_size == 0) { 4660 if (BC->getBinaryFunctionContainingAddress(Symbol.st_value, 4661 /*CheckPastEnd=*/false, 4662 /*UseMaxSize=*/true)) { 4663 // Can only delete the symbol if not patching. Such symbols should 4664 // not exist in the dynamic symbol table. 4665 assert(!IsDynSym && "cannot delete symbol"); 4666 continue; 4667 } 4668 } 4669 } 4670 } 4671 4672 // Handle special symbols based on their name. 4673 Expected<StringRef> SymbolName = Symbol.getName(StringSection); 4674 assert(SymbolName && "cannot get symbol name"); 4675 4676 auto updateSymbolValue = [&](const StringRef Name, unsigned &IsUpdated) { 4677 NewSymbol.st_value = getNewValueForSymbol(Name); 4678 NewSymbol.st_shndx = ELF::SHN_ABS; 4679 outs() << "BOLT-INFO: setting " << Name << " to 0x" 4680 << Twine::utohexstr(NewSymbol.st_value) << '\n'; 4681 ++IsUpdated; 4682 }; 4683 4684 if (opts::HotText && 4685 (*SymbolName == "__hot_start" || *SymbolName == "__hot_end")) 4686 updateSymbolValue(*SymbolName, NumHotTextSymsUpdated); 4687 4688 if (opts::HotData && 4689 (*SymbolName == "__hot_data_start" || *SymbolName == "__hot_data_end")) 4690 updateSymbolValue(*SymbolName, NumHotDataSymsUpdated); 4691 4692 if (*SymbolName == "_end") { 4693 unsigned Ignored; 4694 updateSymbolValue(*SymbolName, Ignored); 4695 } 4696 4697 if (IsDynSym) 4698 Write((&Symbol - cantFail(Obj.symbols(&SymTabSection)).begin()) * 4699 sizeof(ELFSymTy), 4700 NewSymbol); 4701 else 4702 Symbols.emplace_back(NewSymbol); 4703 } 4704 4705 if (IsDynSym) { 4706 assert(Symbols.empty()); 4707 return; 4708 } 4709 4710 // Add symbols of injected functions 4711 for (BinaryFunction *Function : BC->getInjectedBinaryFunctions()) { 4712 ELFSymTy NewSymbol; 4713 BinarySection *OriginSection = Function->getOriginSection(); 4714 NewSymbol.st_shndx = 4715 OriginSection 4716 ? getNewSectionIndex(OriginSection->getSectionRef().getIndex()) 4717 : Function->getCodeSection()->getIndex(); 4718 NewSymbol.st_value = Function->getOutputAddress(); 4719 NewSymbol.st_name = AddToStrTab(Function->getOneName()); 4720 NewSymbol.st_size = Function->getOutputSize(); 4721 NewSymbol.st_other = 0; 4722 NewSymbol.setBindingAndType(ELF::STB_LOCAL, ELF::STT_FUNC); 4723 Symbols.emplace_back(NewSymbol); 4724 4725 if (Function->isSplit()) { 4726 ELFSymTy NewColdSym = NewSymbol; 4727 NewColdSym.setType(ELF::STT_NOTYPE); 4728 SmallVector<char, 256> Buf; 4729 NewColdSym.st_name = AddToStrTab( 4730 Twine(Function->getPrintName()).concat(".cold.0").toStringRef(Buf)); 4731 NewColdSym.st_value = Function->cold().getAddress(); 4732 NewColdSym.st_size = Function->cold().getImageSize(); 4733 Symbols.emplace_back(NewColdSym); 4734 } 4735 } 4736 4737 assert((!NumHotTextSymsUpdated || NumHotTextSymsUpdated == 2) && 4738 "either none or both __hot_start/__hot_end symbols were expected"); 4739 assert((!NumHotDataSymsUpdated || NumHotDataSymsUpdated == 2) && 4740 "either none or both __hot_data_start/__hot_data_end symbols were " 4741 "expected"); 4742 4743 auto addSymbol = [&](const std::string &Name) { 4744 ELFSymTy Symbol; 4745 Symbol.st_value = getNewValueForSymbol(Name); 4746 Symbol.st_shndx = ELF::SHN_ABS; 4747 Symbol.st_name = AddToStrTab(Name); 4748 Symbol.st_size = 0; 4749 Symbol.st_other = 0; 4750 Symbol.setBindingAndType(ELF::STB_WEAK, ELF::STT_NOTYPE); 4751 4752 outs() << "BOLT-INFO: setting " << Name << " to 0x" 4753 << Twine::utohexstr(Symbol.st_value) << '\n'; 4754 4755 Symbols.emplace_back(Symbol); 4756 }; 4757 4758 if (opts::HotText && !NumHotTextSymsUpdated) { 4759 addSymbol("__hot_start"); 4760 addSymbol("__hot_end"); 4761 } 4762 4763 if (opts::HotData && !NumHotDataSymsUpdated) { 4764 addSymbol("__hot_data_start"); 4765 addSymbol("__hot_data_end"); 4766 } 4767 4768 // Put local symbols at the beginning. 4769 std::stable_sort(Symbols.begin(), Symbols.end(), 4770 [](const ELFSymTy &A, const ELFSymTy &B) { 4771 if (A.getBinding() == ELF::STB_LOCAL && 4772 B.getBinding() != ELF::STB_LOCAL) 4773 return true; 4774 return false; 4775 }); 4776 4777 for (const ELFSymTy &Symbol : Symbols) 4778 Write(0, Symbol); 4779 } 4780 4781 template <typename ELFT> 4782 void RewriteInstance::patchELFSymTabs(ELFObjectFile<ELFT> *File) { 4783 const ELFFile<ELFT> &Obj = File->getELFFile(); 4784 using ELFShdrTy = typename ELFObjectFile<ELFT>::Elf_Shdr; 4785 using ELFSymTy = typename ELFObjectFile<ELFT>::Elf_Sym; 4786 4787 // Compute a preview of how section indices will change after rewriting, so 4788 // we can properly update the symbol table based on new section indices. 4789 std::vector<uint32_t> NewSectionIndex; 4790 getOutputSections(File, NewSectionIndex); 4791 4792 // Set pointer at the end of the output file, so we can pwrite old symbol 4793 // tables if we need to. 4794 uint64_t NextAvailableOffset = getFileOffsetForAddress(NextAvailableAddress); 4795 assert(NextAvailableOffset >= FirstNonAllocatableOffset && 4796 "next available offset calculation failure"); 4797 Out->os().seek(NextAvailableOffset); 4798 4799 // Update dynamic symbol table. 4800 const ELFShdrTy *DynSymSection = nullptr; 4801 for (const ELFShdrTy &Section : cantFail(Obj.sections())) { 4802 if (Section.sh_type == ELF::SHT_DYNSYM) { 4803 DynSymSection = &Section; 4804 break; 4805 } 4806 } 4807 assert((DynSymSection || BC->IsStaticExecutable) && 4808 "dynamic symbol table expected"); 4809 if (DynSymSection) { 4810 updateELFSymbolTable( 4811 File, 4812 /*IsDynSym=*/true, 4813 *DynSymSection, 4814 NewSectionIndex, 4815 [&](size_t Offset, const ELFSymTy &Sym) { 4816 Out->os().pwrite(reinterpret_cast<const char *>(&Sym), 4817 sizeof(ELFSymTy), 4818 DynSymSection->sh_offset + Offset); 4819 }, 4820 [](StringRef) -> size_t { return 0; }); 4821 } 4822 4823 if (opts::RemoveSymtab) 4824 return; 4825 4826 // (re)create regular symbol table. 4827 const ELFShdrTy *SymTabSection = nullptr; 4828 for (const ELFShdrTy &Section : cantFail(Obj.sections())) { 4829 if (Section.sh_type == ELF::SHT_SYMTAB) { 4830 SymTabSection = &Section; 4831 break; 4832 } 4833 } 4834 if (!SymTabSection) { 4835 errs() << "BOLT-WARNING: no symbol table found\n"; 4836 return; 4837 } 4838 4839 const ELFShdrTy *StrTabSection = 4840 cantFail(Obj.getSection(SymTabSection->sh_link)); 4841 std::string NewContents; 4842 std::string NewStrTab = std::string( 4843 File->getData().substr(StrTabSection->sh_offset, StrTabSection->sh_size)); 4844 StringRef SecName = cantFail(Obj.getSectionName(*SymTabSection)); 4845 StringRef StrSecName = cantFail(Obj.getSectionName(*StrTabSection)); 4846 4847 NumLocalSymbols = 0; 4848 updateELFSymbolTable( 4849 File, 4850 /*IsDynSym=*/false, 4851 *SymTabSection, 4852 NewSectionIndex, 4853 [&](size_t Offset, const ELFSymTy &Sym) { 4854 if (Sym.getBinding() == ELF::STB_LOCAL) 4855 ++NumLocalSymbols; 4856 NewContents.append(reinterpret_cast<const char *>(&Sym), 4857 sizeof(ELFSymTy)); 4858 }, 4859 [&](StringRef Str) { 4860 size_t Idx = NewStrTab.size(); 4861 NewStrTab.append(NameResolver::restore(Str).str()); 4862 NewStrTab.append(1, '\0'); 4863 return Idx; 4864 }); 4865 4866 BC->registerOrUpdateNoteSection(SecName, 4867 copyByteArray(NewContents), 4868 NewContents.size(), 4869 /*Alignment=*/1, 4870 /*IsReadOnly=*/true, 4871 ELF::SHT_SYMTAB); 4872 4873 BC->registerOrUpdateNoteSection(StrSecName, 4874 copyByteArray(NewStrTab), 4875 NewStrTab.size(), 4876 /*Alignment=*/1, 4877 /*IsReadOnly=*/true, 4878 ELF::SHT_STRTAB); 4879 } 4880 4881 template <typename ELFT> 4882 void 4883 RewriteInstance::patchELFAllocatableRelaSections(ELFObjectFile<ELFT> *File) { 4884 using Elf_Rela = typename ELFT::Rela; 4885 raw_fd_ostream &OS = Out->os(); 4886 const ELFFile<ELFT> &EF = File->getELFFile(); 4887 4888 uint64_t RelDynOffset = 0, RelDynEndOffset = 0; 4889 uint64_t RelPltOffset = 0, RelPltEndOffset = 0; 4890 4891 auto setSectionFileOffsets = [&](uint64_t Address, uint64_t &Start, 4892 uint64_t &End) { 4893 ErrorOr<BinarySection &> Section = BC->getSectionForAddress(Address); 4894 Start = Section->getInputFileOffset(); 4895 End = Start + Section->getSize(); 4896 }; 4897 4898 if (!DynamicRelocationsAddress && !PLTRelocationsAddress) 4899 return; 4900 4901 if (DynamicRelocationsAddress) 4902 setSectionFileOffsets(*DynamicRelocationsAddress, RelDynOffset, 4903 RelDynEndOffset); 4904 4905 if (PLTRelocationsAddress) 4906 setSectionFileOffsets(*PLTRelocationsAddress, RelPltOffset, 4907 RelPltEndOffset); 4908 4909 DynamicRelativeRelocationsCount = 0; 4910 4911 auto writeRela = [&OS](const Elf_Rela *RelA, uint64_t &Offset) { 4912 OS.pwrite(reinterpret_cast<const char *>(RelA), sizeof(*RelA), Offset); 4913 Offset += sizeof(*RelA); 4914 }; 4915 4916 auto writeRelocations = [&](bool PatchRelative) { 4917 for (BinarySection &Section : BC->allocatableSections()) { 4918 for (const Relocation &Rel : Section.dynamicRelocations()) { 4919 const bool IsRelative = Rel.isRelative(); 4920 if (PatchRelative != IsRelative) 4921 continue; 4922 4923 if (IsRelative) 4924 ++DynamicRelativeRelocationsCount; 4925 4926 Elf_Rela NewRelA; 4927 uint64_t SectionAddress = Section.getOutputAddress(); 4928 SectionAddress = 4929 SectionAddress == 0 ? Section.getAddress() : SectionAddress; 4930 MCSymbol *Symbol = Rel.Symbol; 4931 uint32_t SymbolIdx = 0; 4932 uint64_t Addend = Rel.Addend; 4933 4934 if (Rel.Symbol) { 4935 SymbolIdx = getOutputDynamicSymbolIndex(Symbol); 4936 } else { 4937 // Usually this case is used for R_*_(I)RELATIVE relocations 4938 const uint64_t Address = getNewFunctionOrDataAddress(Addend); 4939 if (Address) 4940 Addend = Address; 4941 } 4942 4943 NewRelA.setSymbolAndType(SymbolIdx, Rel.Type, EF.isMips64EL()); 4944 NewRelA.r_offset = SectionAddress + Rel.Offset; 4945 NewRelA.r_addend = Addend; 4946 4947 const bool IsJmpRel = 4948 !!(IsJmpRelocation.find(Rel.Type) != IsJmpRelocation.end()); 4949 uint64_t &Offset = IsJmpRel ? RelPltOffset : RelDynOffset; 4950 const uint64_t &EndOffset = 4951 IsJmpRel ? RelPltEndOffset : RelDynEndOffset; 4952 if (!Offset || !EndOffset) { 4953 errs() << "BOLT-ERROR: Invalid offsets for dynamic relocation\n"; 4954 exit(1); 4955 } 4956 4957 if (Offset + sizeof(NewRelA) > EndOffset) { 4958 errs() << "BOLT-ERROR: Offset overflow for dynamic relocation\n"; 4959 exit(1); 4960 } 4961 4962 writeRela(&NewRelA, Offset); 4963 } 4964 } 4965 }; 4966 4967 // The dynamic linker expects R_*_RELATIVE relocations to be emitted first 4968 writeRelocations(/* PatchRelative */ true); 4969 writeRelocations(/* PatchRelative */ false); 4970 4971 auto fillNone = [&](uint64_t &Offset, uint64_t EndOffset) { 4972 if (!Offset) 4973 return; 4974 4975 typename ELFObjectFile<ELFT>::Elf_Rela RelA; 4976 RelA.setSymbolAndType(0, Relocation::getNone(), EF.isMips64EL()); 4977 RelA.r_offset = 0; 4978 RelA.r_addend = 0; 4979 while (Offset < EndOffset) 4980 writeRela(&RelA, Offset); 4981 4982 assert(Offset == EndOffset && "Unexpected section overflow"); 4983 }; 4984 4985 // Fill the rest of the sections with R_*_NONE relocations 4986 fillNone(RelDynOffset, RelDynEndOffset); 4987 fillNone(RelPltOffset, RelPltEndOffset); 4988 } 4989 4990 template <typename ELFT> 4991 void RewriteInstance::patchELFGOT(ELFObjectFile<ELFT> *File) { 4992 raw_fd_ostream &OS = Out->os(); 4993 4994 SectionRef GOTSection; 4995 for (const SectionRef &Section : File->sections()) { 4996 StringRef SectionName = cantFail(Section.getName()); 4997 if (SectionName == ".got") { 4998 GOTSection = Section; 4999 break; 5000 } 5001 } 5002 if (!GOTSection.getObject()) { 5003 if (!BC->IsStaticExecutable) 5004 errs() << "BOLT-INFO: no .got section found\n"; 5005 return; 5006 } 5007 5008 StringRef GOTContents = cantFail(GOTSection.getContents()); 5009 for (const uint64_t *GOTEntry = 5010 reinterpret_cast<const uint64_t *>(GOTContents.data()); 5011 GOTEntry < reinterpret_cast<const uint64_t *>(GOTContents.data() + 5012 GOTContents.size()); 5013 ++GOTEntry) { 5014 if (uint64_t NewAddress = getNewFunctionAddress(*GOTEntry)) { 5015 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: patching GOT entry 0x" 5016 << Twine::utohexstr(*GOTEntry) << " with 0x" 5017 << Twine::utohexstr(NewAddress) << '\n'); 5018 OS.pwrite(reinterpret_cast<const char *>(&NewAddress), sizeof(NewAddress), 5019 reinterpret_cast<const char *>(GOTEntry) - 5020 File->getData().data()); 5021 } 5022 } 5023 } 5024 5025 template <typename ELFT> 5026 void RewriteInstance::patchELFDynamic(ELFObjectFile<ELFT> *File) { 5027 if (BC->IsStaticExecutable) 5028 return; 5029 5030 const ELFFile<ELFT> &Obj = File->getELFFile(); 5031 raw_fd_ostream &OS = Out->os(); 5032 5033 using Elf_Phdr = typename ELFFile<ELFT>::Elf_Phdr; 5034 using Elf_Dyn = typename ELFFile<ELFT>::Elf_Dyn; 5035 5036 // Locate DYNAMIC by looking through program headers. 5037 uint64_t DynamicOffset = 0; 5038 const Elf_Phdr *DynamicPhdr = 0; 5039 for (const Elf_Phdr &Phdr : cantFail(Obj.program_headers())) { 5040 if (Phdr.p_type == ELF::PT_DYNAMIC) { 5041 DynamicOffset = Phdr.p_offset; 5042 DynamicPhdr = &Phdr; 5043 assert(Phdr.p_memsz == Phdr.p_filesz && "dynamic sizes should match"); 5044 break; 5045 } 5046 } 5047 assert(DynamicPhdr && "missing dynamic in ELF binary"); 5048 5049 bool ZNowSet = false; 5050 5051 // Go through all dynamic entries and patch functions addresses with 5052 // new ones. 5053 typename ELFT::DynRange DynamicEntries = 5054 cantFail(Obj.dynamicEntries(), "error accessing dynamic table"); 5055 auto DTB = DynamicEntries.begin(); 5056 for (const Elf_Dyn &Dyn : DynamicEntries) { 5057 Elf_Dyn NewDE = Dyn; 5058 bool ShouldPatch = true; 5059 switch (Dyn.d_tag) { 5060 default: 5061 ShouldPatch = false; 5062 break; 5063 case ELF::DT_RELACOUNT: 5064 NewDE.d_un.d_val = DynamicRelativeRelocationsCount; 5065 break; 5066 case ELF::DT_INIT: 5067 case ELF::DT_FINI: { 5068 if (BC->HasRelocations) { 5069 if (uint64_t NewAddress = getNewFunctionAddress(Dyn.getPtr())) { 5070 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: patching dynamic entry of type " 5071 << Dyn.getTag() << '\n'); 5072 NewDE.d_un.d_ptr = NewAddress; 5073 } 5074 } 5075 RuntimeLibrary *RtLibrary = BC->getRuntimeLibrary(); 5076 if (RtLibrary && Dyn.getTag() == ELF::DT_FINI) { 5077 if (uint64_t Addr = RtLibrary->getRuntimeFiniAddress()) 5078 NewDE.d_un.d_ptr = Addr; 5079 } 5080 if (RtLibrary && Dyn.getTag() == ELF::DT_INIT && !BC->HasInterpHeader) { 5081 if (auto Addr = RtLibrary->getRuntimeStartAddress()) { 5082 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: Set DT_INIT to 0x" 5083 << Twine::utohexstr(Addr) << '\n'); 5084 NewDE.d_un.d_ptr = Addr; 5085 } 5086 } 5087 break; 5088 } 5089 case ELF::DT_FLAGS: 5090 if (BC->RequiresZNow) { 5091 NewDE.d_un.d_val |= ELF::DF_BIND_NOW; 5092 ZNowSet = true; 5093 } 5094 break; 5095 case ELF::DT_FLAGS_1: 5096 if (BC->RequiresZNow) { 5097 NewDE.d_un.d_val |= ELF::DF_1_NOW; 5098 ZNowSet = true; 5099 } 5100 break; 5101 } 5102 if (ShouldPatch) 5103 OS.pwrite(reinterpret_cast<const char *>(&NewDE), sizeof(NewDE), 5104 DynamicOffset + (&Dyn - DTB) * sizeof(Dyn)); 5105 } 5106 5107 if (BC->RequiresZNow && !ZNowSet) { 5108 errs() << "BOLT-ERROR: output binary requires immediate relocation " 5109 "processing which depends on DT_FLAGS or DT_FLAGS_1 presence in " 5110 ".dynamic. Please re-link the binary with -znow.\n"; 5111 exit(1); 5112 } 5113 } 5114 5115 template <typename ELFT> 5116 Error RewriteInstance::readELFDynamic(ELFObjectFile<ELFT> *File) { 5117 const ELFFile<ELFT> &Obj = File->getELFFile(); 5118 5119 using Elf_Phdr = typename ELFFile<ELFT>::Elf_Phdr; 5120 using Elf_Dyn = typename ELFFile<ELFT>::Elf_Dyn; 5121 5122 // Locate DYNAMIC by looking through program headers. 5123 const Elf_Phdr *DynamicPhdr = 0; 5124 for (const Elf_Phdr &Phdr : cantFail(Obj.program_headers())) { 5125 if (Phdr.p_type == ELF::PT_DYNAMIC) { 5126 DynamicPhdr = &Phdr; 5127 break; 5128 } 5129 } 5130 5131 if (!DynamicPhdr) { 5132 outs() << "BOLT-INFO: static input executable detected\n"; 5133 // TODO: static PIE executable might have dynamic header 5134 BC->IsStaticExecutable = true; 5135 return Error::success(); 5136 } 5137 5138 if (DynamicPhdr->p_memsz != DynamicPhdr->p_filesz) 5139 return createStringError(errc::executable_format_error, 5140 "dynamic section sizes should match"); 5141 5142 // Go through all dynamic entries to locate entries of interest. 5143 auto DynamicEntriesOrErr = Obj.dynamicEntries(); 5144 if (!DynamicEntriesOrErr) 5145 return DynamicEntriesOrErr.takeError(); 5146 typename ELFT::DynRange DynamicEntries = DynamicEntriesOrErr.get(); 5147 5148 for (const Elf_Dyn &Dyn : DynamicEntries) { 5149 switch (Dyn.d_tag) { 5150 case ELF::DT_INIT: 5151 if (!BC->HasInterpHeader) { 5152 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: Set start function address\n"); 5153 BC->StartFunctionAddress = Dyn.getPtr(); 5154 } 5155 break; 5156 case ELF::DT_FINI: 5157 BC->FiniFunctionAddress = Dyn.getPtr(); 5158 break; 5159 case ELF::DT_RELA: 5160 DynamicRelocationsAddress = Dyn.getPtr(); 5161 break; 5162 case ELF::DT_RELASZ: 5163 DynamicRelocationsSize = Dyn.getVal(); 5164 break; 5165 case ELF::DT_JMPREL: 5166 PLTRelocationsAddress = Dyn.getPtr(); 5167 break; 5168 case ELF::DT_PLTRELSZ: 5169 PLTRelocationsSize = Dyn.getVal(); 5170 break; 5171 case ELF::DT_RELACOUNT: 5172 DynamicRelativeRelocationsCount = Dyn.getVal(); 5173 break; 5174 } 5175 } 5176 5177 if (!DynamicRelocationsAddress || !DynamicRelocationsSize) { 5178 DynamicRelocationsAddress.reset(); 5179 DynamicRelocationsSize = 0; 5180 } 5181 5182 if (!PLTRelocationsAddress || !PLTRelocationsSize) { 5183 PLTRelocationsAddress.reset(); 5184 PLTRelocationsSize = 0; 5185 } 5186 return Error::success(); 5187 } 5188 5189 uint64_t RewriteInstance::getNewFunctionAddress(uint64_t OldAddress) { 5190 const BinaryFunction *Function = BC->getBinaryFunctionAtAddress(OldAddress); 5191 if (!Function) 5192 return 0; 5193 5194 assert(!Function->isFragment() && "cannot get new address for a fragment"); 5195 5196 return Function->getOutputAddress(); 5197 } 5198 5199 uint64_t RewriteInstance::getNewFunctionOrDataAddress(uint64_t OldAddress) { 5200 if (uint64_t Function = getNewFunctionAddress(OldAddress)) 5201 return Function; 5202 5203 const BinaryData *BD = BC->getBinaryDataAtAddress(OldAddress); 5204 if (BD && BD->isMoved()) 5205 return BD->getOutputAddress(); 5206 5207 return 0; 5208 } 5209 5210 void RewriteInstance::rewriteFile() { 5211 std::error_code EC; 5212 Out = std::make_unique<ToolOutputFile>(opts::OutputFilename, EC, 5213 sys::fs::OF_None); 5214 check_error(EC, "cannot create output executable file"); 5215 5216 raw_fd_ostream &OS = Out->os(); 5217 5218 // Copy allocatable part of the input. 5219 OS << InputFile->getData().substr(0, FirstNonAllocatableOffset); 5220 5221 // We obtain an asm-specific writer so that we can emit nops in an 5222 // architecture-specific way at the end of the function. 5223 std::unique_ptr<MCAsmBackend> MAB( 5224 BC->TheTarget->createMCAsmBackend(*BC->STI, *BC->MRI, MCTargetOptions())); 5225 auto Streamer = BC->createStreamer(OS); 5226 // Make sure output stream has enough reserved space, otherwise 5227 // pwrite() will fail. 5228 uint64_t Offset = OS.seek(getFileOffsetForAddress(NextAvailableAddress)); 5229 (void)Offset; 5230 assert(Offset == getFileOffsetForAddress(NextAvailableAddress) && 5231 "error resizing output file"); 5232 5233 // Overwrite functions with fixed output address. This is mostly used by 5234 // non-relocation mode, with one exception: injected functions are covered 5235 // here in both modes. 5236 uint64_t CountOverwrittenFunctions = 0; 5237 uint64_t OverwrittenScore = 0; 5238 for (BinaryFunction *Function : BC->getAllBinaryFunctions()) { 5239 if (Function->getImageAddress() == 0 || Function->getImageSize() == 0) 5240 continue; 5241 5242 if (Function->getImageSize() > Function->getMaxSize()) { 5243 if (opts::Verbosity >= 1) 5244 errs() << "BOLT-WARNING: new function size (0x" 5245 << Twine::utohexstr(Function->getImageSize()) 5246 << ") is larger than maximum allowed size (0x" 5247 << Twine::utohexstr(Function->getMaxSize()) << ") for function " 5248 << *Function << '\n'; 5249 5250 // Remove jump table sections that this function owns in non-reloc mode 5251 // because we don't want to write them anymore. 5252 if (!BC->HasRelocations && opts::JumpTables == JTS_BASIC) { 5253 for (auto &JTI : Function->JumpTables) { 5254 JumpTable *JT = JTI.second; 5255 BinarySection &Section = JT->getOutputSection(); 5256 BC->deregisterSection(Section); 5257 } 5258 } 5259 continue; 5260 } 5261 5262 if (Function->isSplit() && (Function->cold().getImageAddress() == 0 || 5263 Function->cold().getImageSize() == 0)) 5264 continue; 5265 5266 OverwrittenScore += Function->getFunctionScore(); 5267 // Overwrite function in the output file. 5268 if (opts::Verbosity >= 2) 5269 outs() << "BOLT: rewriting function \"" << *Function << "\"\n"; 5270 5271 OS.pwrite(reinterpret_cast<char *>(Function->getImageAddress()), 5272 Function->getImageSize(), Function->getFileOffset()); 5273 5274 // Write nops at the end of the function. 5275 if (Function->getMaxSize() != std::numeric_limits<uint64_t>::max()) { 5276 uint64_t Pos = OS.tell(); 5277 OS.seek(Function->getFileOffset() + Function->getImageSize()); 5278 MAB->writeNopData(OS, Function->getMaxSize() - Function->getImageSize(), 5279 &*BC->STI); 5280 5281 OS.seek(Pos); 5282 } 5283 5284 if (!Function->isSplit()) { 5285 ++CountOverwrittenFunctions; 5286 if (opts::MaxFunctions && 5287 CountOverwrittenFunctions == opts::MaxFunctions) { 5288 outs() << "BOLT: maximum number of functions reached\n"; 5289 break; 5290 } 5291 continue; 5292 } 5293 5294 // Write cold part 5295 if (opts::Verbosity >= 2) 5296 outs() << "BOLT: rewriting function \"" << *Function 5297 << "\" (cold part)\n"; 5298 5299 OS.pwrite(reinterpret_cast<char *>(Function->cold().getImageAddress()), 5300 Function->cold().getImageSize(), 5301 Function->cold().getFileOffset()); 5302 5303 ++CountOverwrittenFunctions; 5304 if (opts::MaxFunctions && CountOverwrittenFunctions == opts::MaxFunctions) { 5305 outs() << "BOLT: maximum number of functions reached\n"; 5306 break; 5307 } 5308 } 5309 5310 // Print function statistics for non-relocation mode. 5311 if (!BC->HasRelocations) { 5312 outs() << "BOLT: " << CountOverwrittenFunctions << " out of " 5313 << BC->getBinaryFunctions().size() 5314 << " functions were overwritten.\n"; 5315 if (BC->TotalScore != 0) { 5316 double Coverage = OverwrittenScore / (double)BC->TotalScore * 100.0; 5317 outs() << format("BOLT-INFO: rewritten functions cover %.2lf", Coverage) 5318 << "% of the execution count of simple functions of " 5319 "this binary\n"; 5320 } 5321 } 5322 5323 if (BC->HasRelocations && opts::TrapOldCode) { 5324 uint64_t SavedPos = OS.tell(); 5325 // Overwrite function body to make sure we never execute these instructions. 5326 for (auto &BFI : BC->getBinaryFunctions()) { 5327 BinaryFunction &BF = BFI.second; 5328 if (!BF.getFileOffset() || !BF.isEmitted()) 5329 continue; 5330 OS.seek(BF.getFileOffset()); 5331 for (unsigned I = 0; I < BF.getMaxSize(); ++I) 5332 OS.write((unsigned char)BC->MIB->getTrapFillValue()); 5333 } 5334 OS.seek(SavedPos); 5335 } 5336 5337 // Write all allocatable sections - reloc-mode text is written here as well 5338 for (BinarySection &Section : BC->allocatableSections()) { 5339 if (!Section.isFinalized() || !Section.getOutputData()) 5340 continue; 5341 5342 if (opts::Verbosity >= 1) 5343 outs() << "BOLT: writing new section " << Section.getName() 5344 << "\n data at 0x" << Twine::utohexstr(Section.getAllocAddress()) 5345 << "\n of size " << Section.getOutputSize() << "\n at offset " 5346 << Section.getOutputFileOffset() << '\n'; 5347 OS.pwrite(reinterpret_cast<const char *>(Section.getOutputData()), 5348 Section.getOutputSize(), Section.getOutputFileOffset()); 5349 } 5350 5351 for (BinarySection &Section : BC->allocatableSections()) 5352 Section.flushPendingRelocations(OS, [this](const MCSymbol *S) { 5353 return getNewValueForSymbol(S->getName()); 5354 }); 5355 5356 // If .eh_frame is present create .eh_frame_hdr. 5357 if (EHFrameSection && EHFrameSection->isFinalized()) 5358 writeEHFrameHeader(); 5359 5360 // Add BOLT Addresses Translation maps to allow profile collection to 5361 // happen in the output binary 5362 if (opts::EnableBAT) 5363 addBATSection(); 5364 5365 // Patch program header table. 5366 patchELFPHDRTable(); 5367 5368 // Finalize memory image of section string table. 5369 finalizeSectionStringTable(); 5370 5371 // Update symbol tables. 5372 patchELFSymTabs(); 5373 5374 patchBuildID(); 5375 5376 if (opts::EnableBAT) 5377 encodeBATSection(); 5378 5379 // Copy non-allocatable sections once allocatable part is finished. 5380 rewriteNoteSections(); 5381 5382 if (BC->HasRelocations) { 5383 patchELFAllocatableRelaSections(); 5384 patchELFGOT(); 5385 } 5386 5387 // Patch dynamic section/segment. 5388 patchELFDynamic(); 5389 5390 // Update ELF book-keeping info. 5391 patchELFSectionHeaderTable(); 5392 5393 if (opts::PrintSections) { 5394 outs() << "BOLT-INFO: Sections after processing:\n"; 5395 BC->printSections(outs()); 5396 } 5397 5398 Out->keep(); 5399 EC = sys::fs::setPermissions(opts::OutputFilename, sys::fs::perms::all_all); 5400 check_error(EC, "cannot set permissions of output file"); 5401 } 5402 5403 void RewriteInstance::writeEHFrameHeader() { 5404 DWARFDebugFrame NewEHFrame(BC->TheTriple->getArch(), true, 5405 EHFrameSection->getOutputAddress()); 5406 Error E = NewEHFrame.parse(DWARFDataExtractor( 5407 EHFrameSection->getOutputContents(), BC->AsmInfo->isLittleEndian(), 5408 BC->AsmInfo->getCodePointerSize())); 5409 check_error(std::move(E), "failed to parse EH frame"); 5410 5411 uint64_t OldEHFrameAddress = 0; 5412 StringRef OldEHFrameContents; 5413 ErrorOr<BinarySection &> OldEHFrameSection = 5414 BC->getUniqueSectionByName(Twine(getOrgSecPrefix(), ".eh_frame").str()); 5415 if (OldEHFrameSection) { 5416 OldEHFrameAddress = OldEHFrameSection->getOutputAddress(); 5417 OldEHFrameContents = OldEHFrameSection->getOutputContents(); 5418 } 5419 DWARFDebugFrame OldEHFrame(BC->TheTriple->getArch(), true, OldEHFrameAddress); 5420 Error Er = OldEHFrame.parse( 5421 DWARFDataExtractor(OldEHFrameContents, BC->AsmInfo->isLittleEndian(), 5422 BC->AsmInfo->getCodePointerSize())); 5423 check_error(std::move(Er), "failed to parse EH frame"); 5424 5425 LLVM_DEBUG(dbgs() << "BOLT: writing a new .eh_frame_hdr\n"); 5426 5427 NextAvailableAddress = 5428 appendPadding(Out->os(), NextAvailableAddress, EHFrameHdrAlign); 5429 5430 const uint64_t EHFrameHdrOutputAddress = NextAvailableAddress; 5431 const uint64_t EHFrameHdrFileOffset = 5432 getFileOffsetForAddress(NextAvailableAddress); 5433 5434 std::vector<char> NewEHFrameHdr = CFIRdWrt->generateEHFrameHeader( 5435 OldEHFrame, NewEHFrame, EHFrameHdrOutputAddress, FailedAddresses); 5436 5437 assert(Out->os().tell() == EHFrameHdrFileOffset && "offset mismatch"); 5438 Out->os().write(NewEHFrameHdr.data(), NewEHFrameHdr.size()); 5439 5440 const unsigned Flags = BinarySection::getFlags(/*IsReadOnly=*/true, 5441 /*IsText=*/false, 5442 /*IsAllocatable=*/true); 5443 BinarySection &EHFrameHdrSec = BC->registerOrUpdateSection( 5444 ".eh_frame_hdr", ELF::SHT_PROGBITS, Flags, nullptr, NewEHFrameHdr.size(), 5445 /*Alignment=*/1); 5446 EHFrameHdrSec.setOutputFileOffset(EHFrameHdrFileOffset); 5447 EHFrameHdrSec.setOutputAddress(EHFrameHdrOutputAddress); 5448 5449 NextAvailableAddress += EHFrameHdrSec.getOutputSize(); 5450 5451 // Merge new .eh_frame with original so that gdb can locate all FDEs. 5452 if (OldEHFrameSection) { 5453 const uint64_t EHFrameSectionSize = (OldEHFrameSection->getOutputAddress() + 5454 OldEHFrameSection->getOutputSize() - 5455 EHFrameSection->getOutputAddress()); 5456 EHFrameSection = 5457 BC->registerOrUpdateSection(".eh_frame", 5458 EHFrameSection->getELFType(), 5459 EHFrameSection->getELFFlags(), 5460 EHFrameSection->getOutputData(), 5461 EHFrameSectionSize, 5462 EHFrameSection->getAlignment()); 5463 BC->deregisterSection(*OldEHFrameSection); 5464 } 5465 5466 LLVM_DEBUG(dbgs() << "BOLT-DEBUG: size of .eh_frame after merge is " 5467 << EHFrameSection->getOutputSize() << '\n'); 5468 } 5469 5470 uint64_t RewriteInstance::getNewValueForSymbol(const StringRef Name) { 5471 uint64_t Value = RTDyld->getSymbol(Name).getAddress(); 5472 if (Value != 0) 5473 return Value; 5474 5475 // Return the original value if we haven't emitted the symbol. 5476 BinaryData *BD = BC->getBinaryDataByName(Name); 5477 if (!BD) 5478 return 0; 5479 5480 return BD->getAddress(); 5481 } 5482 5483 uint64_t RewriteInstance::getFileOffsetForAddress(uint64_t Address) const { 5484 // Check if it's possibly part of the new segment. 5485 if (Address >= NewTextSegmentAddress) 5486 return Address - NewTextSegmentAddress + NewTextSegmentOffset; 5487 5488 // Find an existing segment that matches the address. 5489 const auto SegmentInfoI = BC->SegmentMapInfo.upper_bound(Address); 5490 if (SegmentInfoI == BC->SegmentMapInfo.begin()) 5491 return 0; 5492 5493 const SegmentInfo &SegmentInfo = std::prev(SegmentInfoI)->second; 5494 if (Address < SegmentInfo.Address || 5495 Address >= SegmentInfo.Address + SegmentInfo.FileSize) 5496 return 0; 5497 5498 return SegmentInfo.FileOffset + Address - SegmentInfo.Address; 5499 } 5500 5501 bool RewriteInstance::willOverwriteSection(StringRef SectionName) { 5502 for (const char *const &OverwriteName : SectionsToOverwrite) 5503 if (SectionName == OverwriteName) 5504 return true; 5505 for (std::string &OverwriteName : DebugSectionsToOverwrite) 5506 if (SectionName == OverwriteName) 5507 return true; 5508 5509 ErrorOr<BinarySection &> Section = BC->getUniqueSectionByName(SectionName); 5510 return Section && Section->isAllocatable() && Section->isFinalized(); 5511 } 5512 5513 bool RewriteInstance::isDebugSection(StringRef SectionName) { 5514 if (SectionName.startswith(".debug_") || SectionName.startswith(".zdebug_") || 5515 SectionName == ".gdb_index" || SectionName == ".stab" || 5516 SectionName == ".stabstr") 5517 return true; 5518 5519 return false; 5520 } 5521 5522 bool RewriteInstance::isKSymtabSection(StringRef SectionName) { 5523 if (SectionName.startswith("__ksymtab")) 5524 return true; 5525 5526 return false; 5527 } 5528