Index: llvm/test/tools/llvm-profgen/inline-noprobe2.test =================================================================== --- llvm/test/tools/llvm-profgen/inline-noprobe2.test +++ llvm/test/tools/llvm-profgen/inline-noprobe2.test @@ -2,6 +2,15 @@ ; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-noprobe2.perfscript --binary=%S/Inputs/inline-noprobe2.perfbin --output=%t ; RUN: FileCheck %s --input-file %t --check-prefix=CHECK +; RUN: llvm-profgen --format=extbinary --perfscript=%S/Inputs/inline-noprobe2.perfscript --binary=%S/Inputs/inline-noprobe2.perfbin --output=%t +; RUN: llvm-profdata show -show-prof-sym-list -sample %t | FileCheck %s --check-prefix=CHECK-SYM-LIST + +; CHECK-SYM-LIST: Dump profile symbol list +; CHECK-SYM-LIST: main +; CHECK-SYM-LIST: partition_pivot_first +; CHECK-SYM-LIST: partition_pivot_last +; CHECK-SYM-LIST: quick_sort + ;CHECK: partition_pivot_first:1045:5 ;CHECK-NEXT: 0: 5 ;CHECK-NEXT: 1: 5 Index: llvm/tools/llvm-profgen/ProfileGenerator.h =================================================================== --- llvm/tools/llvm-profgen/ProfileGenerator.h +++ llvm/tools/llvm-profgen/ProfileGenerator.h @@ -50,8 +50,8 @@ protected: // Use SampleProfileWriter to serialize profile map - void write(std::unique_ptr Writer, - SampleProfileMap &ProfileMap); + virtual void write(std::unique_ptr Writer, + SampleProfileMap &ProfileMap); /* For each region boundary point, mark if it is begin or end (or both) of the region. Boundary points are inclusive. Log the sample count as well @@ -104,6 +104,8 @@ void populateBodySamplesForAllFunctions(const RangeSample &RangeCounter); void populateBoundarySamplesForAllFunctions(const BranchSample &BranchCounters); + void write(std::unique_ptr Writer, + SampleProfileMap &ProfileMap) override; }; using ProbeCounterMap = Index: llvm/tools/llvm-profgen/ProfileGenerator.cpp =================================================================== --- llvm/tools/llvm-profgen/ProfileGenerator.cpp +++ llvm/tools/llvm-profgen/ProfileGenerator.cpp @@ -32,6 +32,10 @@ cl::desc("Use md5 to represent function names in the output profile (only " "meaningful for -extbinary)")); +static cl::opt PopulateProfileSymbolList( + "populate-profile-symbol-list", cl::init(true), cl::Hidden, + cl::desc("Populate profile symbol list (only meaningful for -extbinary)")); + static cl::opt RecursionCompression( "compress-recursion", cl::desc("Compressing recursion by deduplicating adjacent frame " @@ -94,6 +98,23 @@ exitWithError(std::move(EC)); } +void ProfileGenerator::write(std::unique_ptr Writer, + SampleProfileMap &ProfileMap) { + // Populate profile symbol list if extended binary format is used, currently + // only support for non-CS profile. + ProfileSymbolList SymbolList; + if (PopulateProfileSymbolList && OutputFormat == SPF_Ext_Binary) { + for (const auto &Item : ProfileMap) { + const FunctionSamples Profile = Item.second; + SymbolList.add(Profile.getName(), true); + } + Writer->setProfileSymbolList(&SymbolList); + } + + if (std::error_code EC = Writer->write(ProfileMap)) + exitWithError(std::move(EC)); +} + void ProfileGeneratorBase::write() { auto WriterOrErr = SampleProfileWriter::create(OutputFilename, OutputFormat); if (std::error_code EC = WriterOrErr.getError())