[BOLT][BAT] Add entries for deleted basic blocks
Deleted basic blocks are required for correct mapping of branches modified by SCTC. Increases BAT size, bytes: - large binary: 8622496 -> 8703244. - small binary (X86/bolt-address-translation.test): 928 -> 940. Test Plan: updated bb-with-two-tail-calls.s Reviewers: ayermolo, dcci, maksfb, rafaelauler Reviewed By: rafaelauler Pull Request: https://github.com/llvm/llvm-project/pull/91906
This commit is contained in:
@@ -54,7 +54,7 @@ void BoltAddressTranslation::writeEntriesForBB(
|
||||
// and this deleted block will both share the same output address (the same
|
||||
// key), and we need to map back. We choose here to privilege the successor by
|
||||
// allowing it to overwrite the previously inserted key in the map.
|
||||
Map[BBOutputOffset] = BBInputOffset << 1;
|
||||
Map.emplace(BBOutputOffset, BBInputOffset << 1);
|
||||
|
||||
const auto &IOAddressMap =
|
||||
BB.getFunction()->getBinaryContext().getIOAddressMap();
|
||||
@@ -71,8 +71,7 @@ void BoltAddressTranslation::writeEntriesForBB(
|
||||
|
||||
LLVM_DEBUG(dbgs() << " Key: " << Twine::utohexstr(OutputOffset) << " Val: "
|
||||
<< Twine::utohexstr(InputOffset) << " (branch)\n");
|
||||
Map.insert(std::pair<uint32_t, uint32_t>(OutputOffset,
|
||||
(InputOffset << 1) | BRANCHENTRY));
|
||||
Map.emplace(OutputOffset, (InputOffset << 1) | BRANCHENTRY);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,6 +106,19 @@ void BoltAddressTranslation::write(const BinaryContext &BC, raw_ostream &OS) {
|
||||
for (const BinaryBasicBlock *const BB :
|
||||
Function.getLayout().getMainFragment())
|
||||
writeEntriesForBB(Map, *BB, InputAddress, OutputAddress);
|
||||
// Add entries for deleted blocks. They are still required for correct BB
|
||||
// mapping of branches modified by SCTC. By convention, they would have the
|
||||
// end of the function as output address.
|
||||
const BBHashMapTy &BBHashMap = getBBHashMap(InputAddress);
|
||||
if (BBHashMap.size() != Function.size()) {
|
||||
const uint64_t EndOffset = Function.getOutputSize();
|
||||
std::unordered_set<uint32_t> MappedInputOffsets;
|
||||
for (const BinaryBasicBlock &BB : Function)
|
||||
MappedInputOffsets.emplace(BB.getInputOffset());
|
||||
for (const auto &[InputOffset, _] : BBHashMap)
|
||||
if (!llvm::is_contained(MappedInputOffsets, InputOffset))
|
||||
Map.emplace(EndOffset, InputOffset << 1);
|
||||
}
|
||||
Maps.emplace(Function.getOutputAddress(), std::move(Map));
|
||||
ReverseMap.emplace(OutputAddress, InputAddress);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user