[llvm] r372439 - [SampleFDO] Expose an interface to return the size of a section or the size

Amara Emerson via llvm-commits llvm-commits at lists.llvm.org
Sat Sep 21 02:11:06 PDT 2019


Hi,

This commit seems to have broken the Mac build/greendragon bots for a while: http://green.lab.llvm.org/green/job/clang-stage1-cmake-RA-incremental/2582

I’ve reverted it r372464.

Thanks,
Amara

> On Sep 20, 2019, at 4:24 PM, Wei Mi via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> Author: wmi
> Date: Fri Sep 20 16:24:50 2019
> New Revision: 372439
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=372439&view=rev
> Log:
> [SampleFDO] Expose an interface to return the size of a section or the size
> of the profile for profile in ExtBinary format.
> 
> Sometimes we want to limit the size of the profile by stripping some functions
> with low sample count or by stripping some function names with small text size
> from profile symbol list. That requires the profile reader to have the
> interfaces returning the size of a section or the size of total profile. The
> patch add those interfaces.
> 
> At the same time, add some dump facility to show the size of each section.
> 
> 
> Added:
>    llvm/trunk/test/tools/llvm-profdata/show-prof-size.test
> Modified:
>    llvm/trunk/include/llvm/ProfileData/SampleProf.h
>    llvm/trunk/include/llvm/ProfileData/SampleProfReader.h
>    llvm/trunk/lib/ProfileData/SampleProfReader.cpp
>    llvm/trunk/tools/llvm-profdata/llvm-profdata.cpp
> 
> Modified: llvm/trunk/include/llvm/ProfileData/SampleProf.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/SampleProf.h?rev=372439&r1=372438&r2=372439&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/ProfileData/SampleProf.h (original)
> +++ llvm/trunk/include/llvm/ProfileData/SampleProf.h Fri Sep 20 16:24:50 2019
> @@ -125,6 +125,22 @@ enum SecType {
>   SecLBRProfile = SecFuncProfileFirst
> };
> 
> +static inline std::string getSecName(SecType Type) {
> +  switch (Type) {
> +  case SecInValid:
> +    return "InvalidSection";
> +  case SecProfSummary:
> +    return "ProfileSummarySection";
> +  case SecNameTable:
> +    return "NameTableSection";
> +  case SecProfileSymbolList:
> +    return "ProfileSymbolListSection";
> +  case SecLBRProfile:
> +    return "LBRProfileSection";
> +  }
> +  llvm_unreachable("A SecType has no name for output");
> +}
> +
> // Entry type of section header table used by SampleProfileExtBinaryBaseReader
> // and SampleProfileExtBinaryBaseWriter.
> struct SecHdrTableEntry {
> 
> Modified: llvm/trunk/include/llvm/ProfileData/SampleProfReader.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/SampleProfReader.h?rev=372439&r1=372438&r2=372439&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/ProfileData/SampleProfReader.h (original)
> +++ llvm/trunk/include/llvm/ProfileData/SampleProfReader.h Fri Sep 20 16:24:50 2019
> @@ -333,6 +333,7 @@ public:
>   /// It includes all the names that have samples either in outline instance
>   /// or inline instance.
>   virtual std::vector<StringRef> *getNameTable() { return nullptr; }
> +  virtual bool dumpSectionInfo(raw_ostream &OS = dbgs()) { return false; };
> 
> protected:
>   /// Map every function to its associated profile.
> @@ -504,6 +505,12 @@ public:
> 
>   /// Read sample profiles in extensible format from the associated file.
>   std::error_code read() override;
> +
> +  /// Get the total size of all \p Type sections.
> +  uint64_t getSectionSize(SecType Type);
> +  /// Get the total size of header and all sections.
> +  uint64_t getFileSize();
> +  virtual bool dumpSectionInfo(raw_ostream &OS = dbgs()) override;
> };
> 
> class SampleProfileReaderExtBinary : public SampleProfileReaderExtBinaryBase {
> 
> Modified: llvm/trunk/lib/ProfileData/SampleProfReader.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ProfileData/SampleProfReader.cpp?rev=372439&r1=372438&r2=372439&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ProfileData/SampleProfReader.cpp (original)
> +++ llvm/trunk/lib/ProfileData/SampleProfReader.cpp Fri Sep 20 16:24:50 2019
> @@ -667,6 +667,36 @@ std::error_code SampleProfileReaderExtBi
>   return sampleprof_error::success;
> }
> 
> +uint64_t SampleProfileReaderExtBinaryBase::getSectionSize(SecType Type) {
> +  for (auto &Entry : SecHdrTable) {
> +    if (Entry.Type == Type)
> +      return Entry.Size;
> +  }
> +  return 0;
> +}
> +
> +uint64_t SampleProfileReaderExtBinaryBase::getFileSize() {
> +  auto &LastEntry = SecHdrTable.back();
> +  return LastEntry.Offset + LastEntry.Size;
> +}
> +
> +bool SampleProfileReaderExtBinaryBase::dumpSectionInfo(raw_ostream &OS) {
> +  uint64_t TotalSecsSize = 0;
> +  for (auto &Entry : SecHdrTable) {
> +    OS << getSecName(Entry.Type) << " - Offset: " << Entry.Offset
> +       << ", Size: " << Entry.Size << "\n";
> +    TotalSecsSize += getSectionSize(Entry.Type);
> +  }
> +  uint64_t HeaderSize = SecHdrTable.front().Offset;
> +  assert(HeaderSize + TotalSecsSize == getFileSize() &&
> +         "Size of 'header + sections' doesn't match the total size of profile");
> +
> +  OS << "Header Size: " << HeaderSize << "\n";
> +  OS << "Total Sections Size: " << TotalSecsSize << "\n";
> +  OS << "File Size: " << getFileSize() << "\n";
> +  return true;
> +}
> +
> std::error_code SampleProfileReaderBinary::readMagicIdent() {
>   // Read and check the magic identifier.
>   auto Magic = readNumber<uint64_t>();
> 
> Added: llvm/trunk/test/tools/llvm-profdata/show-prof-size.test
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-profdata/show-prof-size.test?rev=372439&view=auto
> ==============================================================================
> --- llvm/trunk/test/tools/llvm-profdata/show-prof-size.test (added)
> +++ llvm/trunk/test/tools/llvm-profdata/show-prof-size.test Fri Sep 20 16:24:50 2019
> @@ -0,0 +1,7 @@
> +; RUN: llvm-profdata merge -sample -extbinary -prof-sym-list=%S/Inputs/profile-symbol-list-1.text %S/Inputs/sample-profile.proftext -o %t.1.output
> +; RUN: ls -l %t.1.output |cut -f5 -d ' ' > %t.txt
> +; RUN: llvm-profdata show -sample -show-sec-info-only %t.1.output >> %t.txt
> +; RUN: FileCheck %s --input-file=%t.txt
> +; Check llvm-profdata shows the correct file size.
> +; CHECK: [[FILESIZE:.*]]
> +; CHECK: [[FILESIZE]]
> 
> Modified: llvm/trunk/tools/llvm-profdata/llvm-profdata.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-profdata/llvm-profdata.cpp?rev=372439&r1=372438&r2=372439&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-profdata/llvm-profdata.cpp (original)
> +++ llvm/trunk/tools/llvm-profdata/llvm-profdata.cpp Fri Sep 20 16:24:50 2019
> @@ -982,10 +982,21 @@ static int showInstrProfile(const std::s
>   return 0;
> }
> 
> +static void showSectionInfo(sampleprof::SampleProfileReader *Reader,
> +                            raw_fd_ostream &OS) {
> +  if (!Reader->dumpSectionInfo(OS)) {
> +    WithColor::warning() << "-show-sec-info-only is only supported for "
> +                         << "sample profile in extbinary format and is "
> +                         << "ignored for other formats.\n";
> +    return;
> +  }
> +}
> +
> static int showSampleProfile(const std::string &Filename, bool ShowCounts,
>                              bool ShowAllFunctions,
>                              const std::string &ShowFunction,
> -                             bool ShowProfileSymbolList, raw_fd_ostream &OS) {
> +                             bool ShowProfileSymbolList,
> +                             bool ShowSectionInfoOnly, raw_fd_ostream &OS) {
>   using namespace sampleprof;
>   LLVMContext Context;
>   auto ReaderOrErr = SampleProfileReader::create(Filename, Context);
> @@ -993,6 +1004,12 @@ static int showSampleProfile(const std::
>     exitWithErrorCode(EC, Filename);
> 
>   auto Reader = std::move(ReaderOrErr.get());
> +
> +  if (ShowSectionInfoOnly) {
> +    showSectionInfo(Reader.get(), OS);
> +    return 0;
> +  }
> +
>   if (std::error_code EC = Reader->read())
>     exitWithErrorCode(EC, Filename);
> 
> @@ -1062,6 +1079,11 @@ static int show_main(int argc, const cha
>   cl::opt<bool> ShowProfileSymbolList(
>       "show-prof-sym-list", cl::init(false),
>       cl::desc("Show profile symbol list if it exists in the profile. "));
> +  cl::opt<bool> ShowSectionInfoOnly(
> +      "show-sec-info-only", cl::init(false),
> +      cl::desc("Show the information of each section in the sample profile. "
> +               "The flag is only usable when the sample profile is in "
> +               "extbinary format"));
> 
>   cl::ParseCommandLineOptions(argc, argv, "LLVM profile data summary\n");
> 
> @@ -1090,7 +1112,8 @@ static int show_main(int argc, const cha
>                             OnlyListBelow, ShowFunction, TextFormat, OS);
>   else
>     return showSampleProfile(Filename, ShowCounts, ShowAllFunctions,
> -                             ShowFunction, ShowProfileSymbolList, OS);
> +                             ShowFunction, ShowProfileSymbolList,
> +                             ShowSectionInfoOnly, OS);
> }
> 
> int main(int argc, const char *argv[]) {
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list