From c6ba9ca1696416cd53d86fc79ad8fe2771243e8a Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Fri, 24 Aug 2018 01:34:45 +0000 Subject: [PATCH] Make llvm-profdata show -text work as advertised in the documentation. Per LLVM's CommandGuide, llvm-profdata show -text is supposed to produce textual output that can be passed as input to further llvm-profdata invocations. This previously didn't work for two reasons: 1) -text was not sufficient to enable the machine-readable text format output; instead, -text was effectively ignored if -counts was not also specified. (With this patch, -counts is instead ignored if -text is specified, because the machine-readable text format always includes counts.) 2) When the input data was an IR-level profile, the :ir marker was missing from the output, resulting in a text format output that would not be usable as profiling data due to function hash mismatches. Differential Revision: https://reviews.llvm.org/D51188 llvm-svn: 340592 --- llvm/test/tools/llvm-profdata/roundtrip.test | 6 ++++++ llvm/tools/llvm-profdata/llvm-profdata.cpp | 8 ++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 llvm/test/tools/llvm-profdata/roundtrip.test diff --git a/llvm/test/tools/llvm-profdata/roundtrip.test b/llvm/test/tools/llvm-profdata/roundtrip.test new file mode 100644 index 0000000..eda2720 --- /dev/null +++ b/llvm/test/tools/llvm-profdata/roundtrip.test @@ -0,0 +1,6 @@ +RUN: llvm-profdata merge -o %t.0.profdata %S/Inputs/IR_profile.proftext +RUN: llvm-profdata show -o %t.0.proftext -all-functions -text %t.0.profdata +RUN: diff %t.0.proftext %S/Inputs/IR_profile.proftext +RUN: llvm-profdata merge -o %t.1.profdata %t.0.proftext +RUN: llvm-profdata show -o %t.1.proftext -all-functions -text %t.1.profdata +RUN: diff %t.1.proftext %S/Inputs/IR_profile.proftext diff --git a/llvm/tools/llvm-profdata/llvm-profdata.cpp b/llvm/tools/llvm-profdata/llvm-profdata.cpp index 1a0b9e1..d62505a 100644 --- a/llvm/tools/llvm-profdata/llvm-profdata.cpp +++ b/llvm/tools/llvm-profdata/llvm-profdata.cpp @@ -600,12 +600,16 @@ static int showInstrProfile(const std::string &Filename, bool ShowCounts, decltype(MinCmp)> HottestFuncs(MinCmp); + // Add marker so that IR-level instrumentation round-trips properly. + if (TextFormat && IsIRInstr) + OS << ":ir\n"; + for (const auto &Func : *Reader) { bool Show = ShowAllFunctions || (!ShowFunction.empty() && Func.Name.find(ShowFunction) != Func.Name.npos); - bool doTextFormatDump = (Show && ShowCounts && TextFormat); + bool doTextFormatDump = (Show && TextFormat); if (doTextFormatDump) { InstrProfSymtab &Symtab = Reader->getSymtab(); @@ -679,7 +683,7 @@ static int showInstrProfile(const std::string &Filename, bool ShowCounts, if (Reader->hasError()) exitWithError(Reader->getError(), Filename); - if (ShowCounts && TextFormat) + if (TextFormat) return 0; std::unique_ptr PS(Builder.getSummary()); OS << "Instrumentation level: " -- 2.7.4