@@ -135,39 +135,7 @@ readMemInfoBlocksV3(const char *Ptr) {
135
135
}
136
136
137
137
llvm::SmallVector<std::pair<uint64_t , MemInfoBlock>>
138
- readMemInfoBlocksV4 (const char *Ptr) {
139
- using namespace support ;
140
-
141
- const uint64_t NumItemsToRead =
142
- endian::readNext<uint64_t , llvm::endianness::little, unaligned>(Ptr);
143
-
144
- llvm::SmallVector<std::pair<uint64_t , MemInfoBlock>> Items;
145
- for (uint64_t I = 0 ; I < NumItemsToRead; I++) {
146
- const uint64_t Id =
147
- endian::readNext<uint64_t , llvm::endianness::little, unaligned>(Ptr);
148
- // We cheat a bit here and remove the const from cast to set the
149
- // Histogram Pointer to newly allocated buffer.
150
- MemInfoBlock MIB = *reinterpret_cast <const MemInfoBlock *>(Ptr);
151
-
152
- // Only increment by size of MIB since readNext implicitly increments.
153
- Ptr += sizeof (MemInfoBlock);
154
-
155
- if (MIB.AccessHistogramSize > 0 ) {
156
- MIB.AccessHistogram =
157
- (uintptr_t )malloc (MIB.AccessHistogramSize * sizeof (uint64_t ));
158
- }
159
-
160
- for (uint64_t J = 0 ; J < MIB.AccessHistogramSize ; J++) {
161
- ((uint64_t *)MIB.AccessHistogram )[J] =
162
- endian::readNext<uint64_t , llvm::endianness::little, unaligned>(Ptr);
163
- }
164
- Items.push_back ({Id, MIB});
165
- }
166
- return Items;
167
- }
168
-
169
- llvm::SmallVector<std::pair<uint64_t , MemInfoBlock>>
170
- readMemInfoBlocksV5 (const char *Ptr) {
138
+ readMemInfoBlocksCommon (const char *Ptr, bool IsHistogramEncoded = false ) {
171
139
using namespace support ;
172
140
173
141
const uint64_t NumItemsToRead =
@@ -186,19 +154,34 @@ readMemInfoBlocksV5(const char *Ptr) {
186
154
MIB.AccessHistogram =
187
155
(uintptr_t )malloc (MIB.AccessHistogramSize * sizeof (uint64_t ));
188
156
for (uint64_t J = 0 ; J < MIB.AccessHistogramSize ; J++) {
189
- // The on-disk format for V5 uses uint16_t which is then decoded to
190
- // uint64_t.
191
- const uint16_t Val =
192
- endian::readNext<uint16_t , llvm::endianness::little, unaligned>(
193
- Ptr);
194
- ((uint64_t *)MIB.AccessHistogram )[J] = decodeHistogramCount (Val);
157
+ if (!IsHistogramEncoded) {
158
+ ((uint64_t *)MIB.AccessHistogram )[J] =
159
+ endian::readNext<uint64_t , llvm::endianness::little, unaligned>(
160
+ Ptr);
161
+ } else {
162
+ // The encoded on-disk format (V5 onwards) uses uint16_t.
163
+ const uint16_t Val =
164
+ endian::readNext<uint16_t , llvm::endianness::little, unaligned>(
165
+ Ptr);
166
+ ((uint64_t *)MIB.AccessHistogram )[J] = decodeHistogramCount (Val);
167
+ }
195
168
}
196
169
}
197
170
Items.push_back ({Id, MIB});
198
171
}
199
172
return Items;
200
173
}
201
174
175
+ llvm::SmallVector<std::pair<uint64_t , MemInfoBlock>>
176
+ readMemInfoBlocksV4 (const char *Ptr) {
177
+ return readMemInfoBlocksCommon (Ptr);
178
+ }
179
+
180
+ llvm::SmallVector<std::pair<uint64_t , MemInfoBlock>>
181
+ readMemInfoBlocksV5 (const char *Ptr) {
182
+ return readMemInfoBlocksCommon (Ptr, /* IsHistogramEncoded=*/ true );
183
+ }
184
+
202
185
CallStackMap readStackInfo (const char *Ptr) {
203
186
using namespace support ;
204
187
0 commit comments