Skip to content

Commit 60babf6

Browse files
author
Vasily Leonenko
committed
[BOLT] Update updateRtFiniReloc to return error instead of assertions
1 parent 035802e commit 60babf6

File tree

2 files changed

+15
-10
lines changed

2 files changed

+15
-10
lines changed

bolt/include/bolt/Rewrite/RewriteInstance.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ class RewriteInstance {
109109

110110
/// If DT_FINI_ARRAY is used for instrumentation, update the relocation of its
111111
/// first entry to point to the instrumentation library's fini address.
112-
void updateRtFiniReloc();
112+
Error updateRtFiniReloc();
113113

114114
/// Create and initialize metadata rewriters for this instance.
115115
void initializeMetadataManager();

bolt/lib/Rewrite/RewriteInstance.cpp

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -813,7 +813,8 @@ Error RewriteInstance::run() {
813813
if (opts::Instrument && !BC->IsStaticExecutable) {
814814
if (Error E = updateRtInitReloc())
815815
return E;
816-
updateRtFiniReloc();
816+
if (Error E = updateRtFiniReloc())
817+
return E;
817818
}
818819

819820
if (opts::OutputFilename == "/dev/null") {
@@ -1592,26 +1593,29 @@ Error RewriteInstance::updateRtInitReloc() {
15921593
return Error::success();
15931594
}
15941595

1595-
void RewriteInstance::updateRtFiniReloc() {
1596+
Error RewriteInstance::updateRtFiniReloc() {
15961597
// Updating DT_FINI is handled by patchELFDynamic.
15971598
if (BC->FiniAddress)
1598-
return;
1599+
return Error::success();
15991600

16001601
const RuntimeLibrary *RT = BC->getRuntimeLibrary();
16011602
if (!RT || !RT->getRuntimeFiniAddress())
1602-
return;
1603+
return Error::success();
16031604

1604-
assert(BC->FiniArrayAddress && BC->FiniArraySize &&
1605-
"inconsistent .fini_array state");
1605+
if (!BC->FiniArrayAddress || !BC->FiniArraySize)
1606+
return createStringError(std::errc::not_supported,
1607+
"inconsistent .fini_array state");
16061608

16071609
ErrorOr<BinarySection &> FiniArraySection =
16081610
BC->getSectionForAddress(*BC->FiniArrayAddress);
1609-
assert(FiniArraySection && ".fini_array removed");
1611+
if (!FiniArraySection)
1612+
return createStringError(std::errc::not_supported, ".fini_array removed");
16101613

16111614
if (std::optional<Relocation> Reloc =
16121615
FiniArraySection->takeDynamicRelocationAt(0)) {
1613-
assert(Reloc->Addend == BC->FiniFunctionAddress &&
1614-
"inconsistent .fini_array dynamic relocation");
1616+
if (Reloc->Addend != BC->FiniFunctionAddress)
1617+
return createStringError(std::errc::not_supported,
1618+
"inconsistent .fini_array dynamic relocation");
16151619
Reloc->Addend = RT->getRuntimeFiniAddress();
16161620
FiniArraySection->addDynamicRelocation(*Reloc);
16171621
}
@@ -1624,6 +1628,7 @@ void RewriteInstance::updateRtFiniReloc() {
16241628
FiniArraySection->addPendingRelocation(Relocation{
16251629
/*Offset*/ 0, /*Symbol*/ nullptr, /*Type*/ Relocation::getAbs64(),
16261630
/*Addend*/ RT->getRuntimeFiniAddress(), /*Value*/ 0});
1631+
return Error::success();
16271632
}
16281633

16291634
void RewriteInstance::registerFragments() {

0 commit comments

Comments
 (0)