[BOLT][NFC] Add BOLTReserved to BinaryContext (#90766)
Use BOLTReserved to track binary space preallocated for BOLT.
This commit is contained in:
@@ -3628,13 +3628,19 @@ void RewriteInstance::mapFileSections(BOLTLinker::SectionMapper MapSection) {
|
||||
}
|
||||
|
||||
if (StartBD) {
|
||||
if (StartBD->getAddress() >= EndBD->getAddress()) {
|
||||
BC->errs() << "BOLT-ERROR: invalid reserved space boundaries\n";
|
||||
exit(1);
|
||||
}
|
||||
BC->BOLTReserved = AddressRange(StartBD->getAddress(), EndBD->getAddress());
|
||||
BC->outs()
|
||||
<< "BOLT-INFO: using reserved space for allocating new sections\n";
|
||||
|
||||
PHDRTableOffset = 0;
|
||||
PHDRTableAddress = 0;
|
||||
NewTextSegmentAddress = 0;
|
||||
NewTextSegmentOffset = 0;
|
||||
NextAvailableAddress = StartBD->getAddress();
|
||||
BC->outs()
|
||||
<< "BOLT-INFO: using reserved space for allocating new sections\n";
|
||||
NextAvailableAddress = BC->BOLTReserved.start();
|
||||
}
|
||||
|
||||
// If no new .eh_frame was written, remove relocated original .eh_frame.
|
||||
@@ -3657,12 +3663,12 @@ void RewriteInstance::mapFileSections(BOLTLinker::SectionMapper MapSection) {
|
||||
// Map the rest of the sections.
|
||||
mapAllocatableSections(MapSection);
|
||||
|
||||
if (StartBD) {
|
||||
const uint64_t ReservedSpace = EndBD->getAddress() - StartBD->getAddress();
|
||||
const uint64_t AllocatedSize = NextAvailableAddress - StartBD->getAddress();
|
||||
if (ReservedSpace < AllocatedSize) {
|
||||
BC->errs() << "BOLT-ERROR: reserved space (" << ReservedSpace << " byte"
|
||||
<< (ReservedSpace == 1 ? "" : "s")
|
||||
if (!BC->BOLTReserved.empty()) {
|
||||
const uint64_t AllocatedSize =
|
||||
NextAvailableAddress - BC->BOLTReserved.start();
|
||||
if (BC->BOLTReserved.size() < AllocatedSize) {
|
||||
BC->errs() << "BOLT-ERROR: reserved space (" << BC->BOLTReserved.size()
|
||||
<< " byte" << (BC->BOLTReserved.size() == 1 ? "" : "s")
|
||||
<< ") is smaller than required for new allocations ("
|
||||
<< AllocatedSize << " bytes)\n";
|
||||
exit(1);
|
||||
@@ -5852,13 +5858,11 @@ void RewriteInstance::writeEHFrameHeader() {
|
||||
|
||||
NextAvailableAddress += EHFrameHdrSec.getOutputSize();
|
||||
|
||||
if (const BinaryData *ReservedEnd =
|
||||
BC->getBinaryDataByName(getBOLTReservedEnd())) {
|
||||
if (NextAvailableAddress > ReservedEnd->getAddress()) {
|
||||
BC->errs() << "BOLT-ERROR: unable to fit " << getEHFrameHdrSectionName()
|
||||
<< " into reserved space\n";
|
||||
exit(1);
|
||||
}
|
||||
if (!BC->BOLTReserved.empty() &&
|
||||
(NextAvailableAddress > BC->BOLTReserved.end())) {
|
||||
BC->errs() << "BOLT-ERROR: unable to fit " << getEHFrameHdrSectionName()
|
||||
<< " into reserved space\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Merge new .eh_frame with the relocated original so that gdb can locate all
|
||||
@@ -5892,7 +5896,7 @@ uint64_t RewriteInstance::getNewValueForSymbol(const StringRef Name) {
|
||||
|
||||
uint64_t RewriteInstance::getFileOffsetForAddress(uint64_t Address) const {
|
||||
// Check if it's possibly part of the new segment.
|
||||
if (Address >= NewTextSegmentAddress)
|
||||
if (NewTextSegmentAddress && Address >= NewTextSegmentAddress)
|
||||
return Address - NewTextSegmentAddress + NewTextSegmentOffset;
|
||||
|
||||
// Find an existing segment that matches the address.
|
||||
|
||||
Reference in New Issue
Block a user