@@ -153,13 +153,12 @@ APInt BoltAddressTranslation::calculateBranchEntriesBitMask(MapTy &Map,
153
153
return BitMask;
154
154
}
155
155
156
- size_t BoltAddressTranslation::getNumEqualOffsets (const MapTy &Map,
157
- uint32_t Skew) const {
156
+ size_t BoltAddressTranslation::getNumEqualOffsets (const MapTy &Map) const {
158
157
size_t EqualOffsets = 0 ;
159
158
for (const std::pair<const uint32_t , uint32_t > &KeyVal : Map) {
160
159
const uint32_t OutputOffset = KeyVal.first ;
161
160
const uint32_t InputOffset = KeyVal.second >> 1 ;
162
- if (OutputOffset == InputOffset - Skew )
161
+ if (OutputOffset == InputOffset)
163
162
++EqualOffsets;
164
163
else
165
164
break ;
@@ -197,17 +196,12 @@ void BoltAddressTranslation::writeMaps(std::map<uint64_t, MapTy> &Maps,
197
196
SecondaryEntryPointsMap.count (Address)
198
197
? SecondaryEntryPointsMap[Address].size ()
199
198
: 0 ;
200
- uint32_t Skew = 0 ;
201
199
if (Cold) {
202
200
auto HotEntryIt = Maps.find (ColdPartSource[Address]);
203
201
assert (HotEntryIt != Maps.end ());
204
202
size_t HotIndex = std::distance (Maps.begin (), HotEntryIt);
205
203
encodeULEB128 (HotIndex - PrevIndex, OS);
206
204
PrevIndex = HotIndex;
207
- // Skew of all input offsets for cold fragments is simply the first input
208
- // offset.
209
- Skew = Map.begin ()->second >> 1 ;
210
- encodeULEB128 (Skew, OS);
211
205
} else {
212
206
// Function hash
213
207
size_t BFHash = getBFHash (HotInputAddress);
@@ -223,21 +217,24 @@ void BoltAddressTranslation::writeMaps(std::map<uint64_t, MapTy> &Maps,
223
217
<< ' \n ' );
224
218
}
225
219
encodeULEB128 (NumEntries, OS);
226
- // Encode the number of equal offsets (output = input - skew) in the
227
- // beginning of the function. Only encode one offset in these cases.
228
- const size_t EqualElems = getNumEqualOffsets (Map, Skew);
229
- encodeULEB128 (EqualElems, OS);
230
- if (EqualElems) {
231
- const size_t BranchEntriesBytes = alignTo (EqualElems, 8 ) / 8 ;
232
- APInt BranchEntries = calculateBranchEntriesBitMask (Map, EqualElems);
233
- OS.write (reinterpret_cast <const char *>(BranchEntries.getRawData ()),
234
- BranchEntriesBytes);
235
- LLVM_DEBUG ({
236
- dbgs () << " BranchEntries: " ;
237
- SmallString<8 > BitMaskStr;
238
- BranchEntries.toString (BitMaskStr, 2 , false );
239
- dbgs () << BitMaskStr << ' \n ' ;
240
- });
220
+ // For hot fragments only: encode the number of equal offsets
221
+ // (output = input) in the beginning of the function. Only encode one offset
222
+ // in these cases.
223
+ const size_t EqualElems = Cold ? 0 : getNumEqualOffsets (Map);
224
+ if (!Cold) {
225
+ encodeULEB128 (EqualElems, OS);
226
+ if (EqualElems) {
227
+ const size_t BranchEntriesBytes = alignTo (EqualElems, 8 ) / 8 ;
228
+ APInt BranchEntries = calculateBranchEntriesBitMask (Map, EqualElems);
229
+ OS.write (reinterpret_cast <const char *>(BranchEntries.getRawData ()),
230
+ BranchEntriesBytes);
231
+ LLVM_DEBUG ({
232
+ dbgs () << " BranchEntries: " ;
233
+ SmallString<8 > BitMaskStr;
234
+ BranchEntries.toString (BitMaskStr, 2 , false );
235
+ dbgs () << BitMaskStr << ' \n ' ;
236
+ });
237
+ }
241
238
}
242
239
const BBHashMapTy &BBHashMap = getBBHashMap (HotInputAddress);
243
240
size_t Index = 0 ;
@@ -318,12 +315,10 @@ void BoltAddressTranslation::parseMaps(std::vector<uint64_t> &HotFuncs,
318
315
uint64_t HotAddress = Cold ? 0 : Address;
319
316
PrevAddress = Address;
320
317
uint32_t SecondaryEntryPoints = 0 ;
321
- uint64_t ColdInputSkew = 0 ;
322
318
if (Cold) {
323
319
HotIndex += DE.getULEB128 (&Offset, &Err);
324
320
HotAddress = HotFuncs[HotIndex];
325
321
ColdPartSource.emplace (Address, HotAddress);
326
- ColdInputSkew = DE.getULEB128 (&Offset, &Err);
327
322
} else {
328
323
HotFuncs.push_back (Address);
329
324
// Function hash
@@ -344,25 +339,28 @@ void BoltAddressTranslation::parseMaps(std::vector<uint64_t> &HotFuncs,
344
339
getULEB128Size (SecondaryEntryPoints)));
345
340
}
346
341
const uint32_t NumEntries = DE.getULEB128 (&Offset, &Err);
347
- // Equal offsets.
348
- const size_t EqualElems = DE. getULEB128 (&Offset, &Err) ;
342
+ // Equal offsets, hot fragments only .
343
+ size_t EqualElems = 0 ;
349
344
APInt BEBitMask;
350
- LLVM_DEBUG (dbgs () << formatv (" Equal offsets: {0}, {1} bytes\n " , EqualElems,
351
- getULEB128Size (EqualElems)));
352
- if (EqualElems) {
353
- const size_t BranchEntriesBytes = alignTo (EqualElems, 8 ) / 8 ;
354
- BEBitMask = APInt (alignTo (EqualElems, 8 ), 0 );
355
- LoadIntFromMemory (
356
- BEBitMask,
357
- reinterpret_cast <const uint8_t *>(
358
- DE.getBytes (&Offset, BranchEntriesBytes, &Err).data ()),
359
- BranchEntriesBytes);
360
- LLVM_DEBUG ({
361
- dbgs () << " BEBitMask: " ;
362
- SmallString<8 > BitMaskStr;
363
- BEBitMask.toString (BitMaskStr, 2 , false );
364
- dbgs () << BitMaskStr << " , " << BranchEntriesBytes << " bytes\n " ;
365
- });
345
+ if (!Cold) {
346
+ EqualElems = DE.getULEB128 (&Offset, &Err);
347
+ LLVM_DEBUG (dbgs () << formatv (" Equal offsets: {0}, {1} bytes\n " ,
348
+ EqualElems, getULEB128Size (EqualElems)));
349
+ if (EqualElems) {
350
+ const size_t BranchEntriesBytes = alignTo (EqualElems, 8 ) / 8 ;
351
+ BEBitMask = APInt (alignTo (EqualElems, 8 ), 0 );
352
+ LoadIntFromMemory (
353
+ BEBitMask,
354
+ reinterpret_cast <const uint8_t *>(
355
+ DE.getBytes (&Offset, BranchEntriesBytes, &Err).data ()),
356
+ BranchEntriesBytes);
357
+ LLVM_DEBUG ({
358
+ dbgs () << " BEBitMask: " ;
359
+ SmallString<8 > BitMaskStr;
360
+ BEBitMask.toString (BitMaskStr, 2 , false );
361
+ dbgs () << BitMaskStr << " , " << BranchEntriesBytes << " bytes\n " ;
362
+ });
363
+ }
366
364
}
367
365
MapTy Map;
368
366
@@ -377,7 +375,7 @@ void BoltAddressTranslation::parseMaps(std::vector<uint64_t> &HotFuncs,
377
375
PrevAddress = OutputAddress;
378
376
int64_t InputDelta = 0 ;
379
377
if (J < EqualElems) {
380
- InputOffset = (( OutputOffset + ColdInputSkew) << 1 ) | BEBitMask[J];
378
+ InputOffset = (OutputOffset << 1 ) | BEBitMask[J];
381
379
} else {
382
380
InputDelta = DE.getSLEB128 (&Offset, &Err);
383
381
InputOffset += InputDelta;
0 commit comments