48 std::vector<PGOAnalysisMap> *PGOAnalyses) {
50 std::vector<BBAddrMap> FunctionEntries;
60 while (!ULEBSizeErr && !MetadataDecodeErr && Cur &&
61 Cur.
tell() <
Data.getData().size()) {
66 return createError(
"unsupported BB address map version: " +
73 return FeatEnableOrErr.takeError();
74 FeatEnable = *FeatEnableOrErr;
76 return createError(
"version should be >= 3 for BB address map when "
77 "callsite offsets feature is enabled: version = " +
80 return createError(
"version should be >= 4 for BB address map when "
81 "basic block hash feature is enabled: version = " +
84 return createError(
"version should be >= 5 for BB address map when "
85 "post link cfg feature is enabled: version = " +
91 NumBBRanges = readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr);
92 if (!Cur || ULEBSizeErr)
95 return createError(
"invalid zero number of BB ranges at offset " +
98 auto AddressOrErr = Extractor.extractAddress(Cur);
100 return AddressOrErr.takeError();
101 RangeBaseAddress = *AddressOrErr;
102 NumBlocksInBBRange = readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr);
104 std::vector<BBAddrMap::BBRangeEntry> BBRangeEntries;
106 for (
uint32_t BBRangeIndex = 0; BBRangeIndex < NumBBRanges;
110 auto AddressOrErr = Extractor.extractAddress(Cur);
112 return AddressOrErr.takeError();
113 RangeBaseAddress = *AddressOrErr;
114 NumBlocksInBBRange = readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr);
116 std::vector<BBAddrMap::BBEntry> BBEntries;
118 for (
uint32_t BlockIndex = 0; !MetadataDecodeErr && !ULEBSizeErr &&
119 Cur && (BlockIndex < NumBlocksInBBRange);
128 readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr);
129 CallsiteEndOffsets.
reserve(NumCallsites);
133 LastCallsiteEndOffset +=
134 readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr);
135 CallsiteEndOffsets.
push_back(LastCallsiteEndOffset);
139 LastCallsiteEndOffset;
140 uint32_t MD = readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr);
144 if (!MetadataOrErr) {
145 MetadataDecodeErr = MetadataOrErr.
takeError();
148 BBEntries.push_back({
ID,
Offset + PrevBBEndOffset,
Size,
149 *MetadataOrErr, CallsiteEndOffsets, Hash});
152 TotalNumBlocks += BBEntries.size();
154 BBRangeEntries.push_back({RangeBaseAddress, std::move(BBEntries)});
156 FunctionEntries.push_back({std::move(BBRangeEntries)});
162 ? readULEB128As<uint64_t>(
Data, Cur, ULEBSizeErr)
165 std::vector<PGOAnalysisMap::PGOBBEntry> PGOBBEntries;
168 !ULEBSizeErr && Cur && (BlockIndex < TotalNumBlocks);
172 ? readULEB128As<uint64_t>(
Data, Cur, ULEBSizeErr)
176 ? readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr)
183 auto SuccCount = readULEB128As<uint64_t>(
Data, Cur, ULEBSizeErr);
185 uint32_t BBID = readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr);
189 ? readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr)
199 PGOBBEntries.push_back(
204 PGOAnalyses->push_back(
211 if (!Cur || ULEBSizeErr || MetadataDecodeErr)
213 std::move(MetadataDecodeErr));
214 return FunctionEntries;