Skip to content

Commit 7bf6639

Browse files
committed
[𝘀𝗽𝗿] initial version
Created using spr 1.3.4
1 parent 9925359 commit 7bf6639

File tree

1 file changed

+32
-46
lines changed

1 file changed

+32
-46
lines changed

bolt/lib/Core/BinaryContext.cpp

Lines changed: 32 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -645,24 +645,19 @@ bool BinaryContext::analyzeJumpTable(const uint64_t Address,
645645

646646
// Function or one of its fragments.
647647
const BinaryFunction *TargetBF = getBinaryFunctionContainingAddress(Value);
648-
const bool DoesBelongToFunction =
649-
BF.containsAddress(Value) ||
650-
(TargetBF && areRelatedFragments(TargetBF, &BF));
651-
if (!DoesBelongToFunction) {
648+
if (!TargetBF || !areRelatedFragments(TargetBF, &BF)) {
652649
LLVM_DEBUG({
653-
if (!BF.containsAddress(Value)) {
654-
dbgs() << "FAIL: function doesn't contain this address\n";
655-
if (TargetBF) {
656-
dbgs() << " ! function containing this address: "
657-
<< TargetBF->getPrintName() << '\n';
658-
if (TargetBF->isFragment()) {
659-
dbgs() << " ! is a fragment";
660-
for (BinaryFunction *Parent : TargetBF->ParentFragments)
661-
dbgs() << ", parent: " << Parent->getPrintName();
662-
dbgs() << '\n';
663-
}
664-
}
665-
}
650+
dbgs() << "FAIL: function doesn't contain this address\n";
651+
if (!TargetBF)
652+
break;
653+
dbgs() << " ! function containing this address: " << *TargetBF << '\n';
654+
if (!TargetBF->isFragment())
655+
break;
656+
dbgs() << " ! is a fragment with parents: ";
657+
ListSeparator LS;
658+
for (BinaryFunction *Parent : TargetBF->ParentFragments)
659+
dbgs() << LS << *Parent;
660+
dbgs() << '\n';
666661
});
667662
break;
668663
}
@@ -702,10 +697,8 @@ void BinaryContext::populateJumpTables() {
702697
++JTI) {
703698
JumpTable *JT = JTI->second;
704699

705-
bool NonSimpleParent = false;
706-
for (BinaryFunction *BF : JT->Parents)
707-
NonSimpleParent |= !BF->isSimple();
708-
if (NonSimpleParent)
700+
auto isSimple = std::bind(&BinaryFunction::isSimple, std::placeholders::_1);
701+
if (!llvm::all_of(JT->Parents, isSimple))
709702
continue;
710703

711704
uint64_t NextJTAddress = 0;
@@ -839,33 +832,26 @@ BinaryContext::getOrCreateJumpTable(BinaryFunction &Function, uint64_t Address,
839832
assert(JT->Type == Type && "jump table types have to match");
840833
assert(Address == JT->getAddress() && "unexpected non-empty jump table");
841834

842-
// Prevent associating a jump table to a specific fragment twice.
843-
if (!llvm::is_contained(JT->Parents, &Function)) {
844-
assert(llvm::all_of(JT->Parents,
845-
[&](const BinaryFunction *BF) {
846-
return areRelatedFragments(&Function, BF);
847-
}) &&
848-
"cannot re-use jump table of a different function");
849-
// Duplicate the entry for the parent function for easy access
850-
JT->Parents.push_back(&Function);
851-
if (opts::Verbosity > 2) {
852-
this->outs() << "BOLT-INFO: Multiple fragments access same jump table: "
853-
<< JT->Parents[0]->getPrintName() << "; "
854-
<< Function.getPrintName() << "\n";
855-
JT->print(this->outs());
856-
}
857-
Function.JumpTables.emplace(Address, JT);
858-
for (BinaryFunction *Parent : JT->Parents)
859-
Parent->setHasIndirectTargetToSplitFragment(true);
860-
}
835+
if (llvm::is_contained(JT->Parents, &Function))
836+
return JT->getFirstLabel();
861837

862-
bool IsJumpTableParent = false;
863-
(void)IsJumpTableParent;
864-
for (BinaryFunction *Frag : JT->Parents)
865-
if (Frag == &Function)
866-
IsJumpTableParent = true;
867-
assert(IsJumpTableParent &&
838+
// Prevent associating a jump table to a specific fragment twice.
839+
auto isSibling = std::bind(&BinaryContext::areRelatedFragments, this,
840+
&Function, std::placeholders::_1);
841+
assert(llvm::all_of(JT->Parents, isSibling) &&
868842
"cannot re-use jump table of a different function");
843+
if (opts::Verbosity > 2) {
844+
this->outs() << "BOLT-INFO: Multiple fragments access same jump table: "
845+
<< JT->Parents[0]->getPrintName() << "; "
846+
<< Function.getPrintName() << "\n";
847+
JT->print(this->outs());
848+
}
849+
if (JT->Parents.size() == 1)
850+
JT->Parents.front()->setHasIndirectTargetToSplitFragment(true);
851+
Function.setHasIndirectTargetToSplitFragment(true);
852+
// Duplicate the entry for the parent function for easy access
853+
JT->Parents.push_back(&Function);
854+
Function.JumpTables.emplace(Address, JT);
869855
return JT->getFirstLabel();
870856
}
871857

0 commit comments

Comments
 (0)