[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