diff --git a/llvm/include/llvm/ProfileData/SampleProf.h b/llvm/include/llvm/ProfileData/SampleProf.h --- a/llvm/include/llvm/ProfileData/SampleProf.h +++ b/llvm/include/llvm/ProfileData/SampleProf.h @@ -961,6 +961,11 @@ raw_ostream &operator<<(raw_ostream &OS, const FunctionSamples &FS); +using NameFunctionSamples = std::pair; + +void sortFuncProfiles(const StringMap &ProfileMap, + std::vector &SortedProfiles); + /// Sort a LocationT->SampleT map by LocationT. /// /// It produces a sorted list of records by ascending diff --git a/llvm/lib/ProfileData/SampleProf.cpp b/llvm/lib/ProfileData/SampleProf.cpp --- a/llvm/lib/ProfileData/SampleProf.cpp +++ b/llvm/lib/ProfileData/SampleProf.cpp @@ -198,6 +198,23 @@ return OS; } +void sampleprof::sortFuncProfiles( + const StringMap &ProfileMap, + std::vector &SortedProfiles) { + for (const auto &I : ProfileMap) { + assert(I.getKey() == I.second.getNameWithContext() && + "Inconsistent profile map"); + SortedProfiles.push_back( + std::make_pair(I.second.getNameWithContext(), &I.second)); + } + llvm::stable_sort(SortedProfiles, [](const NameFunctionSamples &A, + const NameFunctionSamples &B) { + if (A.second->getTotalSamples() == B.second->getTotalSamples()) + return A.first > B.first; + return A.second->getTotalSamples() > B.second->getTotalSamples(); + }); +} + unsigned FunctionSamples::getOffset(const DILocation *DIL) { return (DIL->getLine() - DIL->getScope()->getSubprogram()->getLine()) & 0xffff; diff --git a/llvm/lib/ProfileData/SampleProfReader.cpp b/llvm/lib/ProfileData/SampleProfReader.cpp --- a/llvm/lib/ProfileData/SampleProfReader.cpp +++ b/llvm/lib/ProfileData/SampleProfReader.cpp @@ -66,8 +66,10 @@ /// Dump all the function profiles found on stream \p OS. void SampleProfileReader::dump(raw_ostream &OS) { - for (const auto &I : Profiles) - dumpFunctionProfile(I.getKey(), OS); + std::vector V; + sortFuncProfiles(Profiles, V); + for (const auto &I : V) + dumpFunctionProfile(I.first, OS); } /// Parse \p Input as function head. diff --git a/llvm/lib/ProfileData/SampleProfWriter.cpp b/llvm/lib/ProfileData/SampleProfWriter.cpp --- a/llvm/lib/ProfileData/SampleProfWriter.cpp +++ b/llvm/lib/ProfileData/SampleProfWriter.cpp @@ -43,21 +43,8 @@ std::error_code SampleProfileWriter::writeFuncProfiles( const StringMap &ProfileMap) { - // Sort the ProfileMap by total samples. - typedef std::pair NameFunctionSamples; std::vector V; - for (const auto &I : ProfileMap) { - assert(I.getKey() == I.second.getNameWithContext() && - "Inconsistent profile map"); - V.push_back(std::make_pair(I.second.getNameWithContext(), &I.second)); - } - llvm::stable_sort( - V, [](const NameFunctionSamples &A, const NameFunctionSamples &B) { - if (A.second->getTotalSamples() == B.second->getTotalSamples()) - return A.first > B.first; - return A.second->getTotalSamples() > B.second->getTotalSamples(); - }); - + sortFuncProfiles(ProfileMap, V); for (const auto &I : V) { if (std::error_code EC = writeSample(*I.second)) return EC; diff --git a/llvm/test/tools/llvm-profdata/Inputs/profile-symbol-list.expected b/llvm/test/tools/llvm-profdata/Inputs/profile-symbol-list.expected --- a/llvm/test/tools/llvm-profdata/Inputs/profile-symbol-list.expected +++ b/llvm/test/tools/llvm-profdata/Inputs/profile-symbol-list.expected @@ -20,14 +20,14 @@ } No inlined callsites in this function } -Function: _Z3fooi: 15422, 1220, 1 sampled lines +Function: _Z3bari: 40602, 2874, 1 sampled lines Samples collected in the function's body { - 1: 1220 + 1: 2874 } No inlined callsites in this function -Function: _Z3bari: 40602, 2874, 1 sampled lines +Function: _Z3fooi: 15422, 1220, 1 sampled lines Samples collected in the function's body { - 1: 2874 + 1: 1220 } No inlined callsites in this function ======== Dump profile symbol list ========