@@ -143,8 +143,8 @@ void BoltAddressTranslation::write(const BinaryContext &BC, raw_ostream &OS) {
143
143
144
144
// Output addresses are delta-encoded
145
145
uint64_t PrevAddress = 0 ;
146
- writeMaps</* Cold=*/ false >(Maps, PrevAddress, OS);
147
- writeMaps</* Cold=*/ true >(Maps, PrevAddress, OS);
146
+ writeMaps</* Cold=*/ false >(PrevAddress, OS);
147
+ writeMaps</* Cold=*/ true >(PrevAddress, OS);
148
148
149
149
BC.outs () << " BOLT-INFO: Wrote " << Maps.size () << " BAT maps\n " ;
150
150
BC.outs () << " BOLT-INFO: Wrote " << FuncHashes.getNumFunctions ()
@@ -182,8 +182,7 @@ size_t BoltAddressTranslation::getNumEqualOffsets(const MapTy &Map,
182
182
}
183
183
184
184
template <bool Cold>
185
- void BoltAddressTranslation::writeMaps (std::map<uint64_t , MapTy> &Maps,
186
- uint64_t &PrevAddress, raw_ostream &OS) {
185
+ void BoltAddressTranslation::writeMaps (uint64_t &PrevAddress, raw_ostream &OS) {
187
186
const uint32_t NumFuncs =
188
187
llvm::count_if (llvm::make_first_range (Maps), [&](const uint64_t Address) {
189
188
return Cold == ColdPartSource.count (Address);
@@ -213,16 +212,17 @@ void BoltAddressTranslation::writeMaps(std::map<uint64_t, MapTy> &Maps,
213
212
: 0 ;
214
213
uint32_t Skew = 0 ;
215
214
if (Cold) {
216
- auto HotEntryIt = Maps. find ( ColdPartSource[Address]);
217
- assert (HotEntryIt != Maps .end ());
218
- size_t HotIndex = std::distance (Maps .begin (), HotEntryIt);
215
+ auto HotEntryIt = llvm::lower_bound (HotFuncs, ColdPartSource[Address]);
216
+ assert (HotEntryIt != HotFuncs .end ());
217
+ size_t HotIndex = std::distance (HotFuncs .begin (), HotEntryIt);
219
218
encodeULEB128 (HotIndex - PrevIndex, OS);
220
219
PrevIndex = HotIndex;
221
220
// Skew of all input offsets for cold fragments is simply the first input
222
221
// offset.
223
222
Skew = Map.begin ()->second >> 1 ;
224
223
encodeULEB128 (Skew, OS);
225
224
} else {
225
+ HotFuncs.push_back (Address);
226
226
// Function hash
227
227
size_t BFHash = getBFHash (HotInputAddress);
228
228
LLVM_DEBUG (dbgs () << " Hash: " << formatv (" {0:x}\n " , BFHash));
@@ -311,17 +311,15 @@ std::error_code BoltAddressTranslation::parse(raw_ostream &OS, StringRef Buf) {
311
311
return make_error_code (llvm::errc::io_error);
312
312
313
313
Error Err (Error::success ());
314
- std::vector<uint64_t > HotFuncs;
315
314
uint64_t PrevAddress = 0 ;
316
- parseMaps</* Cold=*/ false >(HotFuncs, PrevAddress, DE, Offset, Err);
317
- parseMaps</* Cold=*/ true >(HotFuncs, PrevAddress, DE, Offset, Err);
315
+ parseMaps</* Cold=*/ false >(PrevAddress, DE, Offset, Err);
316
+ parseMaps</* Cold=*/ true >(PrevAddress, DE, Offset, Err);
318
317
OS << " BOLT-INFO: Parsed " << Maps.size () << " BAT entries\n " ;
319
318
return errorToErrorCode (std::move (Err));
320
319
}
321
320
322
321
template <bool Cold>
323
- void BoltAddressTranslation::parseMaps (std::vector<uint64_t > &HotFuncs,
324
- uint64_t &PrevAddress, DataExtractor &DE,
322
+ void BoltAddressTranslation::parseMaps (uint64_t &PrevAddress, DataExtractor &DE,
325
323
uint64_t &Offset, Error &Err) {
326
324
const uint32_t NumFunctions = DE.getULEB128 (&Offset, &Err);
327
325
LLVM_DEBUG (dbgs () << " Parsing " << NumFunctions << (Cold ? " cold" : " " )
0 commit comments