@@ -102,15 +102,17 @@ void BoltAddressTranslation::write(const BinaryContext &BC, raw_ostream &OS) {
102
102
}
103
103
}
104
104
105
- writeMaps</* Cold=*/ false >(Maps, OS);
106
- writeMaps</* Cold=*/ true >(Maps, OS);
105
+ // Output addresses are delta-encoded
106
+ uint64_t PrevAddress = 0 ;
107
+ writeMaps</* Cold=*/ false >(Maps, PrevAddress, OS);
108
+ writeMaps</* Cold=*/ true >(Maps, PrevAddress, OS);
107
109
108
110
outs () << " BOLT-INFO: Wrote " << Maps.size () << " BAT maps\n " ;
109
111
}
110
112
111
113
template <bool Cold>
112
114
void BoltAddressTranslation::writeMaps (std::map<uint64_t , MapTy> &Maps,
113
- raw_ostream &OS) {
115
+ uint64_t &PrevAddress, raw_ostream &OS) {
114
116
const uint32_t NumFuncs =
115
117
llvm::count_if (llvm::make_first_range (Maps), [&](const uint64_t Address) {
116
118
return Cold == ColdPartSource.count (Address);
@@ -119,8 +121,6 @@ void BoltAddressTranslation::writeMaps(std::map<uint64_t, MapTy> &Maps,
119
121
LLVM_DEBUG (dbgs () << " Writing " << NumFuncs << (Cold ? " cold" : " " )
120
122
<< " functions for BAT.\n " );
121
123
size_t PrevIndex = 0 ;
122
- // Output addresses are delta-encoded
123
- uint64_t PrevAddress = 0 ;
124
124
for (auto &MapEntry : Maps) {
125
125
const uint64_t Address = MapEntry.first ;
126
126
// Only process cold fragments in cold mode, and vice versa.
@@ -139,12 +139,14 @@ void BoltAddressTranslation::writeMaps(std::map<uint64_t, MapTy> &Maps,
139
139
PrevIndex = HotIndex;
140
140
}
141
141
encodeULEB128 (NumEntries, OS);
142
- uint64_t InOffset = 0 , OutOffset = 0 ;
142
+ uint64_t InOffset = 0 ;
143
143
// Output and Input addresses and delta-encoded
144
144
for (std::pair<const uint32_t , uint32_t > &KeyVal : Map) {
145
- encodeULEB128 (KeyVal.first - OutOffset, OS);
145
+ const uint64_t OutputAddress = KeyVal.first + Address;
146
+ encodeULEB128 (OutputAddress - PrevAddress, OS);
147
+ PrevAddress = OutputAddress;
146
148
encodeSLEB128 (KeyVal.second - InOffset, OS);
147
- std::tie (OutOffset, InOffset) = KeyVal;
149
+ InOffset = KeyVal. second ;
148
150
}
149
151
}
150
152
}
@@ -170,21 +172,21 @@ std::error_code BoltAddressTranslation::parse(StringRef Buf) {
170
172
171
173
Error Err (Error::success ());
172
174
std::vector<uint64_t > HotFuncs;
173
- parseMaps</* Cold=*/ false >(HotFuncs, DE, Offset, Err);
174
- parseMaps</* Cold=*/ true >(HotFuncs, DE, Offset, Err);
175
+ uint64_t PrevAddress = 0 ;
176
+ parseMaps</* Cold=*/ false >(HotFuncs, PrevAddress, DE, Offset, Err);
177
+ parseMaps</* Cold=*/ true >(HotFuncs, PrevAddress, DE, Offset, Err);
175
178
outs () << " BOLT-INFO: Parsed " << Maps.size () << " BAT entries\n " ;
176
179
return errorToErrorCode (std::move (Err));
177
180
}
178
181
179
182
template <bool Cold>
180
183
void BoltAddressTranslation::parseMaps (std::vector<uint64_t > &HotFuncs,
181
- DataExtractor &DE, uint64_t &Offset ,
182
- Error &Err) {
184
+ uint64_t &PrevAddress, DataExtractor &DE ,
185
+ uint64_t &Offset, Error &Err) {
183
186
const uint32_t NumFunctions = DE.getULEB128 (&Offset, &Err);
184
187
LLVM_DEBUG (dbgs () << " Parsing " << NumFunctions << (Cold ? " cold" : " " )
185
188
<< " functions\n " );
186
189
size_t HotIndex = 0 ;
187
- uint64_t PrevAddress = 0 ;
188
190
for (uint32_t I = 0 ; I < NumFunctions; ++I) {
189
191
const uint64_t Address = PrevAddress + DE.getULEB128 (&Offset, &Err);
190
192
PrevAddress = Address;
@@ -199,18 +201,20 @@ void BoltAddressTranslation::parseMaps(std::vector<uint64_t> &HotFuncs,
199
201
200
202
LLVM_DEBUG (dbgs () << " Parsing " << NumEntries << " entries for 0x"
201
203
<< Twine::utohexstr (Address) << " \n " );
202
- uint64_t InputOffset = 0 , OutputOffset = 0 ;
204
+ uint64_t InputOffset = 0 ;
203
205
for (uint32_t J = 0 ; J < NumEntries; ++J) {
204
206
const uint64_t OutputDelta = DE.getULEB128 (&Offset, &Err);
207
+ const uint64_t OutputAddress = PrevAddress + OutputDelta;
208
+ const uint64_t OutputOffset = OutputAddress - Address;
209
+ PrevAddress = OutputAddress;
205
210
const int64_t InputDelta = DE.getSLEB128 (&Offset, &Err);
206
- OutputOffset += OutputDelta;
207
211
InputOffset += InputDelta;
208
212
Map.insert (std::pair<uint32_t , uint32_t >(OutputOffset, InputOffset));
209
- LLVM_DEBUG (dbgs () << formatv ( " {0:x} -> {1:x} ({2}/{3}b -> {4}/{5}b) \n " ,
210
- OutputOffset, InputOffset, OutputDelta ,
211
- encodeULEB128 (OutputDelta, nulls ()) ,
212
- InputDelta,
213
- encodeSLEB128 (InputDelta, nulls ())));
213
+ LLVM_DEBUG (
214
+ dbgs () << formatv ( " {0:x} -> {1:x} ({2}/{3}b -> {4}/{5}b), {6:x} \n " ,
215
+ OutputOffset, InputOffset, OutputDelta ,
216
+ encodeULEB128 (OutputDelta, nulls ()), InputDelta,
217
+ encodeSLEB128 (InputDelta, nulls ()), OutputAddress ));
214
218
}
215
219
Maps.insert (std::pair<uint64_t , MapTy>(Address, Map));
216
220
}
0 commit comments