diff --git a/bolt/Exceptions.cpp b/bolt/Exceptions.cpp index 1113f2b9c57b..4d411ccc0112 100644 --- a/bolt/Exceptions.cpp +++ b/bolt/Exceptions.cpp @@ -723,23 +723,24 @@ void CFIReaderWriter::rewriteHeaderFor(StringRef EHFrame, continue; } - const uint8_t *DataStart = + const uint8_t *DataEnd = reinterpret_cast(Data.getData().substr(Offset).data()); - const uint8_t *DataEnd = DataStart; uint64_t FuncAddress = readEncodedPointer(DataEnd, DW_EH_PE_sdata4 | DW_EH_PE_pcrel, NewEHFrameAddress + Offset - (uintptr_t)DataEnd); - Offset += DataEnd - DataStart; + + Offset = EndStructureOffset; + + // Ignore FDEs pointing to zero. + if (FuncAddress == 0) + continue; auto I = std::lower_bound(FailedAddresses.begin(), FailedAddresses.end(), FuncAddress); - if (I != FailedAddresses.end() && *I == FuncAddress) { - Offset = EndStructureOffset; + if (I != FailedAddresses.end() && *I == FuncAddress) continue; - } PCToFDE[FuncAddress] = NewEHFrameAddress + StartOffset; - Offset = EndStructureOffset; } //Updates the EHFrameHdr diff --git a/bolt/RewriteInstance.cpp b/bolt/RewriteInstance.cpp index 0874f38be2fe..241dd40a47a4 100644 --- a/bolt/RewriteInstance.cpp +++ b/bolt/RewriteInstance.cpp @@ -1574,23 +1574,30 @@ void RewriteInstance::emitFunctions() { "cannot find section for cold part"); // Cold fragments are aligned at 16 bytes. NextAvailableAddress = RoundUpToAlignment(NextAvailableAddress, 16); - DEBUG(dbgs() << "BOLT: mapping 0x" - << Twine::utohexstr(SMII->second.AllocAddress) << " to 0x" - << Twine::utohexstr(NextAvailableAddress) << " with size " - << Twine::utohexstr(SMII->second.Size) << '\n'); + if (TooLarge) { + // The corresponding FDE will refer to address 0. + Function.cold().setAddress(0); + Function.cold().setImageAddress(0); + Function.cold().setImageSize(0); + Function.cold().setFileOffset(0); + } else { + Function.cold().setAddress(NextAvailableAddress); + Function.cold().setImageAddress(SMII->second.AllocAddress); + Function.cold().setImageSize(SMII->second.Size); + Function.cold().setFileOffset(getFileOffsetFor(NextAvailableAddress)); + } + + DEBUG(dbgs() << "BOLT: mapping cold fragment 0x" + << Twine::utohexstr(Function.cold().getImageAddress()) + << " to 0x" + << Twine::utohexstr(Function.cold().getAddress()) + << " with size " + << Twine::utohexstr(Function.cold().getImageSize()) << '\n'); OLT.mapSectionAddress(ObjectsHandle, SMII->second.SectionID, - NextAvailableAddress); - Function.cold().setAddress(NextAvailableAddress); - Function.cold().setImageAddress(SMII->second.AllocAddress); - Function.cold().setImageSize(TooLarge ? 0 : SMII->second.Size); - Function.cold().setFileOffset(getFileOffsetFor(NextAvailableAddress)); + Function.cold().getAddress()); NextAvailableAddress += Function.cold().getImageSize(); - - if (TooLarge) { - FailedAddresses.emplace_back(Function.cold().getAddress()); - } } // Add the new text section aggregating all existing code sections.