@@ -102,15 +102,17 @@ void BoltAddressTranslation::write(const BinaryContext &BC, raw_ostream &OS) {
102102 }
103103 }
104104
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);
107109
108110 outs () << " BOLT-INFO: Wrote " << Maps.size () << " BAT maps\n " ;
109111}
110112
111113template <bool Cold>
112114void BoltAddressTranslation::writeMaps (std::map<uint64_t , MapTy> &Maps,
113- raw_ostream &OS) {
115+ uint64_t &PrevAddress, raw_ostream &OS) {
114116 const uint32_t NumFuncs =
115117 llvm::count_if (llvm::make_first_range (Maps), [&](const uint64_t Address) {
116118 return Cold == ColdPartSource.count (Address);
@@ -119,8 +121,6 @@ void BoltAddressTranslation::writeMaps(std::map<uint64_t, MapTy> &Maps,
119121 LLVM_DEBUG (dbgs () << " Writing " << NumFuncs << (Cold ? " cold" : " " )
120122 << " functions for BAT.\n " );
121123 size_t PrevIndex = 0 ;
122- // Output addresses are delta-encoded
123- uint64_t PrevAddress = 0 ;
124124 for (auto &MapEntry : Maps) {
125125 const uint64_t Address = MapEntry.first ;
126126 // Only process cold fragments in cold mode, and vice versa.
@@ -139,12 +139,14 @@ void BoltAddressTranslation::writeMaps(std::map<uint64_t, MapTy> &Maps,
139139 PrevIndex = HotIndex;
140140 }
141141 encodeULEB128 (NumEntries, OS);
142- uint64_t InOffset = 0 , OutOffset = 0 ;
142+ uint64_t InOffset = 0 ;
143143 // Output and Input addresses and delta-encoded
144144 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;
146148 encodeSLEB128 (KeyVal.second - InOffset, OS);
147- std::tie (OutOffset, InOffset) = KeyVal;
149+ InOffset = KeyVal. second ;
148150 }
149151 }
150152}
@@ -170,21 +172,21 @@ std::error_code BoltAddressTranslation::parse(StringRef Buf) {
170172
171173 Error Err (Error::success ());
172174 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);
175178 outs () << " BOLT-INFO: Parsed " << Maps.size () << " BAT entries\n " ;
176179 return errorToErrorCode (std::move (Err));
177180}
178181
179182template <bool Cold>
180183void 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) {
183186 const uint32_t NumFunctions = DE.getULEB128 (&Offset, &Err);
184187 LLVM_DEBUG (dbgs () << " Parsing " << NumFunctions << (Cold ? " cold" : " " )
185188 << " functions\n " );
186189 size_t HotIndex = 0 ;
187- uint64_t PrevAddress = 0 ;
188190 for (uint32_t I = 0 ; I < NumFunctions; ++I) {
189191 const uint64_t Address = PrevAddress + DE.getULEB128 (&Offset, &Err);
190192 PrevAddress = Address;
@@ -199,18 +201,20 @@ void BoltAddressTranslation::parseMaps(std::vector<uint64_t> &HotFuncs,
199201
200202 LLVM_DEBUG (dbgs () << " Parsing " << NumEntries << " entries for 0x"
201203 << Twine::utohexstr (Address) << " \n " );
202- uint64_t InputOffset = 0 , OutputOffset = 0 ;
204+ uint64_t InputOffset = 0 ;
203205 for (uint32_t J = 0 ; J < NumEntries; ++J) {
204206 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;
205210 const int64_t InputDelta = DE.getSLEB128 (&Offset, &Err);
206- OutputOffset += OutputDelta;
207211 InputOffset += InputDelta;
208212 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 ));
214218 }
215219 Maps.insert (std::pair<uint64_t , MapTy>(Address, Map));
216220 }
0 commit comments