@@ -274,7 +274,7 @@ static StringRef getProbeFNameForGUID(const GUIDProbeFunctionMap &GUID2FuncMAP,
274
274
auto It = GUID2FuncMAP.find (GUID);
275
275
assert (It != GUID2FuncMAP.end () &&
276
276
" Probe function must exist for a valid GUID" );
277
- return It->second . FuncName ;
277
+ return It->FuncName ;
278
278
}
279
279
280
280
void MCPseudoProbeFuncDesc::print (raw_ostream &OS) {
@@ -390,32 +390,46 @@ bool MCPseudoProbeDecoder::buildGUID2FuncDescMap(const uint8_t *Start,
390
390
Data = Start;
391
391
End = Data + Size;
392
392
393
+ uint32_t FuncDescCount = 0 ;
393
394
while (Data < End) {
394
- auto ErrorOrGUID = readUnencodedNumber< uint64_t >();
395
- if (!ErrorOrGUID )
395
+ // GUID
396
+ if (!readUnencodedNumber< uint64_t >() )
396
397
return false ;
397
-
398
- auto ErrorOrHash = readUnencodedNumber<uint64_t >();
399
- if (!ErrorOrHash)
398
+ // Hash
399
+ if (!readUnencodedNumber<uint64_t >())
400
400
return false ;
401
401
402
402
auto ErrorOrNameSize = readUnsignedNumber<uint32_t >();
403
403
if (!ErrorOrNameSize)
404
404
return false ;
405
- uint32_t NameSize = std::move (*ErrorOrNameSize);
406
-
407
- auto ErrorOrName = readString (NameSize);
408
- if (!ErrorOrName)
405
+ // Function name
406
+ if (!readString (*ErrorOrNameSize))
409
407
return false ;
408
+ ++FuncDescCount;
409
+ }
410
+ assert (Data == End && " Have unprocessed data in pseudo_probe_desc section" );
411
+ GUID2FuncDescMap.reserve (FuncDescCount);
410
412
411
- uint64_t GUID = std::move (*ErrorOrGUID);
412
- uint64_t Hash = std::move (*ErrorOrHash);
413
- StringRef Name = std::move (*ErrorOrName);
413
+ Data = Start;
414
+ End = Data + Size;
415
+ while (Data < End) {
416
+ uint64_t GUID =
417
+ cantFail (errorOrToExpected (readUnencodedNumber<uint64_t >()));
418
+ uint64_t Hash =
419
+ cantFail (errorOrToExpected (readUnencodedNumber<uint64_t >()));
420
+ uint32_t NameSize =
421
+ cantFail (errorOrToExpected (readUnsignedNumber<uint32_t >()));
422
+ StringRef Name = cantFail (errorOrToExpected (readString (NameSize)));
414
423
415
424
// Initialize PseudoProbeFuncDesc and populate it into GUID2FuncDescMap
416
- GUID2FuncDescMap.emplace (GUID, MCPseudoProbeFuncDesc (GUID, Hash, Name));
425
+ GUID2FuncDescMap.emplace_back (GUID, Hash, Name. copy (FuncNameAllocator ));
417
426
}
418
427
assert (Data == End && " Have unprocessed data in pseudo_probe_desc section" );
428
+ assert (GUID2FuncDescMap.size () == FuncDescCount &&
429
+ " Mismatching function description count pre- and post-parsing" );
430
+ llvm::sort (GUID2FuncDescMap, [](const auto &LHS, const auto &RHS) {
431
+ return LHS.FuncGUID < RHS.FuncGUID ;
432
+ });
419
433
return true ;
420
434
}
421
435
@@ -648,12 +662,8 @@ bool MCPseudoProbeDecoder::buildAddress2ProbeMap(
648
662
649
663
void MCPseudoProbeDecoder::printGUID2FuncDescMap (raw_ostream &OS) {
650
664
OS << " Pseudo Probe Desc:\n " ;
651
- // Make the output deterministic
652
- std::map<uint64_t , MCPseudoProbeFuncDesc> OrderedMap (GUID2FuncDescMap.begin (),
653
- GUID2FuncDescMap.end ());
654
- for (auto &I : OrderedMap) {
655
- I.second .print (OS);
656
- }
665
+ for (auto &I : GUID2FuncDescMap)
666
+ I.print (OS);
657
667
}
658
668
659
669
void MCPseudoProbeDecoder::printProbeForAddress (raw_ostream &OS,
@@ -705,7 +715,7 @@ const MCPseudoProbeFuncDesc *
705
715
MCPseudoProbeDecoder::getFuncDescForGUID (uint64_t GUID) const {
706
716
auto It = GUID2FuncDescMap.find (GUID);
707
717
assert (It != GUID2FuncDescMap.end () && " Function descriptor doesn't exist" );
708
- return &It-> second ;
718
+ return &*It ;
709
719
}
710
720
711
721
void MCPseudoProbeDecoder::getInlineContextForProbe (
0 commit comments