@@ -987,6 +987,10 @@ class ModuleSummaryIndexBitcodeReader : public BitcodeReaderBase {
987987 // / ids from the lists in the callsite and alloc entries to the index.
988988 std::vector<uint64_t > StackIds;
989989
990+ // / Linearized radix tree of allocation contexts. See the description above
991+ // / the CallStackRadixTreeBuilder class in ProfileData/MemProf.h for format.
992+ std::vector<uint64_t > RadixArray;
993+
990994public:
991995 ModuleSummaryIndexBitcodeReader (
992996 BitstreamCursor Stream, StringRef Strtab, ModuleSummaryIndex &TheIndex,
@@ -1013,6 +1017,8 @@ class ModuleSummaryIndexBitcodeReader : public BitcodeReaderBase {
10131017 TypeIdCompatibleVtableInfo &TypeId);
10141018 std::vector<FunctionSummary::ParamAccess>
10151019 parseParamAccesses (ArrayRef<uint64_t > Record);
1020+ SmallVector<unsigned > parseAllocInfoContext (ArrayRef<uint64_t > Record,
1021+ unsigned &I);
10161022
10171023 template <bool AllowNullValueInfo = false >
10181024 std::pair<ValueInfo, GlobalValue::GUID>
@@ -7544,6 +7550,48 @@ void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableSummaryRecord(
75447550 parseTypeIdCompatibleVtableInfo (Record, Slot, TypeId);
75457551}
75467552
7553+ SmallVector<unsigned > ModuleSummaryIndexBitcodeReader::parseAllocInfoContext (
7554+ ArrayRef<uint64_t > Record, unsigned &I) {
7555+ SmallVector<unsigned > StackIdList;
7556+ // For backwards compatibility with old format before radix tree was
7557+ // used, simply see if we found a radix tree array record (and thus if
7558+ // the RadixArray is non-empty).
7559+ if (RadixArray.empty ()) {
7560+ unsigned NumStackEntries = Record[I++];
7561+ assert (Record.size () - I >= NumStackEntries);
7562+ StackIdList.reserve (NumStackEntries);
7563+ for (unsigned J = 0 ; J < NumStackEntries; J++) {
7564+ assert (Record[I] < StackIds.size ());
7565+ StackIdList.push_back (
7566+ TheIndex.addOrGetStackIdIndex (StackIds[Record[I++]]));
7567+ }
7568+ } else {
7569+ unsigned RadixIndex = Record[I++];
7570+ // See the comments above CallStackRadixTreeBuilder in ProfileData/MemProf.h
7571+ // for a detailed description of the radix tree array format. Briefly, the
7572+ // first entry will be the number of frames, any negative values are the
7573+ // negative of the offset of the next frame, and otherwise the frames are in
7574+ // increasing linear order.
7575+ assert (RadixIndex < RadixArray.size ());
7576+ unsigned NumStackIds = RadixArray[RadixIndex++];
7577+ StackIdList.reserve (NumStackIds);
7578+ while (NumStackIds--) {
7579+ assert (RadixIndex < RadixArray.size ());
7580+ unsigned Elem = RadixArray[RadixIndex];
7581+ if (static_cast <std::make_signed_t <unsigned >>(Elem) < 0 ) {
7582+ RadixIndex = RadixIndex - Elem;
7583+ assert (RadixIndex < RadixArray.size ());
7584+ Elem = RadixArray[RadixIndex];
7585+ // We shouldn't encounter a second offset in a row.
7586+ assert (static_cast <std::make_signed_t <unsigned >>(Elem) >= 0 );
7587+ }
7588+ RadixIndex++;
7589+ StackIdList.push_back (TheIndex.addOrGetStackIdIndex (StackIds[Elem]));
7590+ }
7591+ }
7592+ return StackIdList;
7593+ }
7594+
75477595static void setSpecialRefs (SmallVectorImpl<ValueInfo> &Refs, unsigned ROCnt,
75487596 unsigned WOCnt) {
75497597 // Readonly and writeonly refs are in the end of the refs list.
@@ -8010,6 +8058,11 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) {
80108058 break ;
80118059 }
80128060
8061+ case bitc::FS_CONTEXT_RADIX_TREE_ARRAY: { // [n x entry]
8062+ RadixArray = ArrayRef<uint64_t >(Record);
8063+ break ;
8064+ }
8065+
80138066 case bitc::FS_PERMODULE_CALLSITE_INFO: {
80148067 unsigned ValueID = Record[0 ];
80158068 SmallVector<unsigned > StackIdList;
@@ -8065,14 +8118,7 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) {
80658118 (Version < 10 && I < Record.size ())) {
80668119 assert (Record.size () - I >= 2 );
80678120 AllocationType AllocType = (AllocationType)Record[I++];
8068- unsigned NumStackEntries = Record[I++];
8069- assert (Record.size () - I >= NumStackEntries);
8070- SmallVector<unsigned > StackIdList;
8071- for (unsigned J = 0 ; J < NumStackEntries; J++) {
8072- assert (Record[I] < StackIds.size ());
8073- StackIdList.push_back (
8074- TheIndex.addOrGetStackIdIndex (StackIds[Record[I++]]));
8075- }
8121+ auto StackIdList = parseAllocInfoContext (Record, I);
80768122 MIBs.push_back (MIBInfo (AllocType, std::move (StackIdList)));
80778123 }
80788124 // We either have nothing left or at least NumMIBs context size info
@@ -8123,14 +8169,7 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) {
81238169 while (MIBsRead++ < NumMIBs) {
81248170 assert (Record.size () - I >= 2 );
81258171 AllocationType AllocType = (AllocationType)Record[I++];
8126- unsigned NumStackEntries = Record[I++];
8127- assert (Record.size () - I >= NumStackEntries);
8128- SmallVector<unsigned > StackIdList;
8129- for (unsigned J = 0 ; J < NumStackEntries; J++) {
8130- assert (Record[I] < StackIds.size ());
8131- StackIdList.push_back (
8132- TheIndex.addOrGetStackIdIndex (StackIds[Record[I++]]));
8133- }
8172+ auto StackIdList = parseAllocInfoContext (Record, I);
81348173 MIBs.push_back (MIBInfo (AllocType, std::move (StackIdList)));
81358174 }
81368175 assert (Record.size () - I >= NumVersions);
0 commit comments