Skip to content

Commit ad7ee90

Browse files
authored
[BOLT][NFC] Add BOLTReserved to BinaryContext (llvm#90766)
Use BOLTReserved to track binary space preallocated for BOLT.
1 parent d484c4d commit ad7ee90

File tree

2 files changed

+25
-17
lines changed

2 files changed

+25
-17
lines changed

bolt/include/bolt/Core/BinaryContext.h

+4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "bolt/Core/JumpTable.h"
2121
#include "bolt/Core/MCPlusBuilder.h"
2222
#include "bolt/RuntimeLibs/RuntimeLibrary.h"
23+
#include "llvm/ADT/AddressRanges.h"
2324
#include "llvm/ADT/ArrayRef.h"
2425
#include "llvm/ADT/StringMap.h"
2526
#include "llvm/ADT/iterator.h"
@@ -726,6 +727,9 @@ class BinaryContext {
726727
uint64_t OldTextSectionOffset{0};
727728
uint64_t OldTextSectionSize{0};
728729

730+
/// Area in the input binary reserved for BOLT.
731+
AddressRange BOLTReserved;
732+
729733
/// Address of the code/function that is executed before any other code in
730734
/// the binary.
731735
std::optional<uint64_t> StartFunctionAddress;

bolt/lib/Rewrite/RewriteInstance.cpp

+21-17
Original file line numberDiff line numberDiff line change
@@ -3628,13 +3628,19 @@ void RewriteInstance::mapFileSections(BOLTLinker::SectionMapper MapSection) {
36283628
}
36293629

36303630
if (StartBD) {
3631+
if (StartBD->getAddress() >= EndBD->getAddress()) {
3632+
BC->errs() << "BOLT-ERROR: invalid reserved space boundaries\n";
3633+
exit(1);
3634+
}
3635+
BC->BOLTReserved = AddressRange(StartBD->getAddress(), EndBD->getAddress());
3636+
BC->outs()
3637+
<< "BOLT-INFO: using reserved space for allocating new sections\n";
3638+
36313639
PHDRTableOffset = 0;
36323640
PHDRTableAddress = 0;
36333641
NewTextSegmentAddress = 0;
36343642
NewTextSegmentOffset = 0;
3635-
NextAvailableAddress = StartBD->getAddress();
3636-
BC->outs()
3637-
<< "BOLT-INFO: using reserved space for allocating new sections\n";
3643+
NextAvailableAddress = BC->BOLTReserved.start();
36383644
}
36393645

36403646
// If no new .eh_frame was written, remove relocated original .eh_frame.
@@ -3657,12 +3663,12 @@ void RewriteInstance::mapFileSections(BOLTLinker::SectionMapper MapSection) {
36573663
// Map the rest of the sections.
36583664
mapAllocatableSections(MapSection);
36593665

3660-
if (StartBD) {
3661-
const uint64_t ReservedSpace = EndBD->getAddress() - StartBD->getAddress();
3662-
const uint64_t AllocatedSize = NextAvailableAddress - StartBD->getAddress();
3663-
if (ReservedSpace < AllocatedSize) {
3664-
BC->errs() << "BOLT-ERROR: reserved space (" << ReservedSpace << " byte"
3665-
<< (ReservedSpace == 1 ? "" : "s")
3666+
if (!BC->BOLTReserved.empty()) {
3667+
const uint64_t AllocatedSize =
3668+
NextAvailableAddress - BC->BOLTReserved.start();
3669+
if (BC->BOLTReserved.size() < AllocatedSize) {
3670+
BC->errs() << "BOLT-ERROR: reserved space (" << BC->BOLTReserved.size()
3671+
<< " byte" << (BC->BOLTReserved.size() == 1 ? "" : "s")
36663672
<< ") is smaller than required for new allocations ("
36673673
<< AllocatedSize << " bytes)\n";
36683674
exit(1);
@@ -5852,13 +5858,11 @@ void RewriteInstance::writeEHFrameHeader() {
58525858

58535859
NextAvailableAddress += EHFrameHdrSec.getOutputSize();
58545860

5855-
if (const BinaryData *ReservedEnd =
5856-
BC->getBinaryDataByName(getBOLTReservedEnd())) {
5857-
if (NextAvailableAddress > ReservedEnd->getAddress()) {
5858-
BC->errs() << "BOLT-ERROR: unable to fit " << getEHFrameHdrSectionName()
5859-
<< " into reserved space\n";
5860-
exit(1);
5861-
}
5861+
if (!BC->BOLTReserved.empty() &&
5862+
(NextAvailableAddress > BC->BOLTReserved.end())) {
5863+
BC->errs() << "BOLT-ERROR: unable to fit " << getEHFrameHdrSectionName()
5864+
<< " into reserved space\n";
5865+
exit(1);
58625866
}
58635867

58645868
// 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) {
58925896

58935897
uint64_t RewriteInstance::getFileOffsetForAddress(uint64_t Address) const {
58945898
// Check if it's possibly part of the new segment.
5895-
if (Address >= NewTextSegmentAddress)
5899+
if (NewTextSegmentAddress && Address >= NewTextSegmentAddress)
58965900
return Address - NewTextSegmentAddress + NewTextSegmentOffset;
58975901

58985902
// Find an existing segment that matches the address.

0 commit comments

Comments
 (0)