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;
75 if (FeatEnable.CallsiteEndOffsets &&
Version < 3)
76 return createError(
"version should be >= 3 for BB address map when "
77 "callsite offsets feature is enabled: version = " +
79 if (FeatEnable.BBHash &&
Version < 4)
80 return createError(
"version should be >= 4 for BB address map when "
81 "basic block hash feature is enabled: version = " +
83 if (FeatEnable.PostLinkCfg &&
Version < 5)
84 return createError(
"version should be >= 5 for BB address map when "
85 "post link cfg feature is enabled: version = " +
87 if (FeatEnable.FuncGUID &&
Version < 6)
88 return createError(
"version should be >= 6 for BB address map when "
89 "function GUID feature is enabled: version = " +
91 uint64_t FuncGUID = FeatEnable.FuncGUID ?
Data.getU64(Cur) : 0;
96 uint64_t RangeBaseAddress = 0;
97 if (FeatEnable.MultiBBRange) {
98 NumBBRanges = readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr);
99 if (!Cur || ULEBSizeErr)
102 return createError(
"invalid zero number of BB ranges at offset " +
105 auto AddressOrErr = Extractor.extractAddress(Cur);
107 return AddressOrErr.takeError();
108 RangeBaseAddress = *AddressOrErr;
109 NumBlocksInBBRange = readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr);
111 std::vector<BBAddrMap::BBRangeEntry> BBRangeEntries;
113 for (
uint32_t BBRangeIndex = 0; BBRangeIndex < NumBBRanges;
116 if (FeatEnable.MultiBBRange) {
117 auto AddressOrErr = Extractor.extractAddress(Cur);
119 return AddressOrErr.takeError();
120 RangeBaseAddress = *AddressOrErr;
121 NumBlocksInBBRange = readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr);
123 std::vector<BBAddrMap::BBEntry> BBEntries;
124 if (!FeatEnable.OmitBBEntries) {
125 for (
uint32_t BlockIndex = 0; !MetadataDecodeErr && !ULEBSizeErr &&
126 Cur && (BlockIndex < NumBlocksInBBRange);
128 uint32_t ID = readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr);
133 if (FeatEnable.CallsiteEndOffsets) {
135 readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr);
136 CallsiteEndOffsets.
reserve(NumCallsites);
140 LastCallsiteEndOffset +=
141 readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr);
142 CallsiteEndOffsets.
push_back(LastCallsiteEndOffset);
146 LastCallsiteEndOffset;
147 uint32_t MD = readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr);
148 uint64_t Hash = FeatEnable.BBHash ?
Data.getU64(Cur) : 0;
151 if (!MetadataOrErr) {
152 MetadataDecodeErr = MetadataOrErr.
takeError();
155 BBEntries.push_back({ID,
Offset + PrevBBEndOffset,
Size,
156 *MetadataOrErr, CallsiteEndOffsets, Hash});
159 TotalNumBlocks += BBEntries.size();
161 BBRangeEntries.push_back({RangeBaseAddress, std::move(BBEntries)});
163 FunctionEntries.push_back({std::move(BBRangeEntries), FuncGUID});
168 FeatEnable.FuncEntryCount
169 ? readULEB128As<uint64_t>(
Data, Cur, ULEBSizeErr)
172 std::vector<PGOAnalysisMap::PGOBBEntry> PGOBBEntries;
175 !ULEBSizeErr && Cur && (BlockIndex < TotalNumBlocks);
178 uint64_t BBF = FeatEnable.BBFreq
179 ? readULEB128As<uint64_t>(
Data, Cur, ULEBSizeErr)
182 FeatEnable.PostLinkCfg
183 ? readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr)
189 if (FeatEnable.BrProb) {
190 auto SuccCount = readULEB128As<uint64_t>(
Data, Cur, ULEBSizeErr);
191 for (uint64_t
I = 0;
I < SuccCount; ++
I) {
192 uint32_t BBID = readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr);
195 FeatEnable.PostLinkCfg
196 ? readULEB128As<uint32_t>(
Data, Cur, ULEBSizeErr)
206 PGOBBEntries.push_back(
211 PGOAnalyses->push_back(
218 if (!Cur || ULEBSizeErr || MetadataDecodeErr)
220 std::move(MetadataDecodeErr));
221 return FunctionEntries;