diff --git a/llvm/test/tools/llvm-profgen/cs-interrupt.test b/llvm/test/tools/llvm-profgen/cs-interrupt.test --- a/llvm/test/tools/llvm-profgen/cs-interrupt.test +++ b/llvm/test/tools/llvm-profgen/cs-interrupt.test @@ -15,26 +15,24 @@ ; CHECK: 2: 3 ; CHECK: 5: 4 -; CHECK-UNWINDER: Binary(noinline-cs-noprobe.perfbin)'s Range Counter: -; CHECK-UNWINDER: main:1 @ foo -; CHECK-UNWINDER: (5ff, 62f): 5 -; CHECK-UNWINDER: (634, 637): 4 -; CHECK-UNWINDER: (645, 645): 5 -; CHECK-UNWINDER: main:1 @ foo:3 @ bar -; CHECK-UNWINDER: (5b0, 5c8): 2 -; CHECK-UNWINDER: (5b0, 5d7): 3 -; CHECK-UNWINDER: (5e5, 5e9): 4 - -; CHECK-UNWINDER: Binary(noinline-cs-noprobe.perfbin)'s Branch Counter: -; CHECK-UNWINDER: main:1 @ foo -; CHECK-UNWINDER: (62f, 5b0): 5 -; CHECK-UNWINDER: (637, 645): 5 -; CHECK-UNWINDER: (645, 5ff): 5 -; CHECK-UNWINDER: main:1 @ foo:3 @ bar -; CHECK-UNWINDER: (5c8, 5dc): 2 -; CHECK-UNWINDER: (5d7, 5e5): 4 -; CHECK-UNWINDER: (5e9, 634): 4 - +; CHECK-UNWINDER: [main:1 @ foo] +; CHECK-UNWINDER-NEXT: 3 +; CHECK-UNWINDER-NEXT: 5ff-62f:5 +; CHECK-UNWINDER-NEXT: 634-637:4 +; CHECK-UNWINDER-NEXT: 645-645:5 +; CHECK-UNWINDER-NEXT: 3 +; CHECK-UNWINDER-NEXT: 62f->5b0:5 +; CHECK-UNWINDER-NEXT: 637->645:5 +; CHECK-UNWINDER-NEXT: 645->5ff:5 +; CHECK-UNWINDER-NEXT: [main:1 @ foo:3 @ bar] +; CHECK-UNWINDER-NEXT: 3 +; CHECK-UNWINDER-NEXT: 5b0-5c8:2 +; CHECK-UNWINDER-NEXT: 5b0-5d7:3 +; CHECK-UNWINDER-NEXT: 5e5-5e9:4 +; CHECK-UNWINDER-NEXT: 3 +; CHECK-UNWINDER-NEXT: 5c8->5dc:2 +; CHECK-UNWINDER-NEXT: 5d7->5e5:4 +; CHECK-UNWINDER-NEXT: 5e9->634:4 ; original code: diff --git a/llvm/test/tools/llvm-profgen/inline-cs-pseudoprobe.test b/llvm/test/tools/llvm-profgen/inline-cs-pseudoprobe.test --- a/llvm/test/tools/llvm-profgen/inline-cs-pseudoprobe.test +++ b/llvm/test/tools/llvm-profgen/inline-cs-pseudoprobe.test @@ -1,4 +1,4 @@ -; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-pseudoprobe.perfscript --binary=%S/Inputs/inline-cs-pseudoprobe.perfbin --output=%t --skip-symbolization --profile-summary-cold-count=0 +; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-pseudoprobe.perfscript --binary=%S/Inputs/inline-cs-pseudoprobe.perfbin --output=%t --skip-symbolization --profile-summary-cold-count=0 --show-relative-address=0 ; RUN: FileCheck %s --input-file %t --check-prefix=CHECK-UNWINDER ; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-pseudoprobe.perfscript --binary=%S/Inputs/inline-cs-pseudoprobe.perfbin --output=%t --profile-summary-cold-count=0 ; RUN: FileCheck %s --input-file %t @@ -19,17 +19,13 @@ ; CHECK-NEXT: 4: 14 ; CHECK-NEXT: !CFGChecksum: 72617220756 - -; CHECK-UNWINDER: Binary(inline-cs-pseudoprobe.perfbin)'s Range Counter: -; CHECK-UNWINDER-EMPTY: -; CHECK-UNWINDER-NEXT: (800, 858): 1 -; CHECK-UNWINDER-NEXT: (80e, 82b): 1 -; CHECK-UNWINDER-NEXT: (80e, 858): 13 - -; CHECK-UNWINDER: Binary(inline-cs-pseudoprobe.perfbin)'s Branch Counter: -; CHECK-UNWINDER-EMPTY: -; CHECK-UNWINDER-NEXT: (82b, 800): 1 -; CHECK-UNWINDER-NEXT: (858, 80e): 15 +; CHECK-UNWINDER: 3 +; CHECK-UNWINDER-NEXT: 201800-201858:1 +; CHECK-UNWINDER-NEXT: 20180e-20182b:1 +; CHECK-UNWINDER-NEXT: 20180e-201858:13 +; CHECK-UNWINDER-NEXT: 2 +; CHECK-UNWINDER-NEXT: 20182b->201800:1 +; CHECK-UNWINDER-NEXT: 201858->20180e:15 ; clang -O3 -fexperimental-new-pass-manager -fuse-ld=lld -fpseudo-probe-for-profiling ; -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -Xclang -mdisable-tail-calls diff --git a/llvm/test/tools/llvm-profgen/noinline-cs-noprobe.test b/llvm/test/tools/llvm-profgen/noinline-cs-noprobe.test --- a/llvm/test/tools/llvm-profgen/noinline-cs-noprobe.test +++ b/llvm/test/tools/llvm-profgen/noinline-cs-noprobe.test @@ -27,27 +27,25 @@ ; CHECK-AGG: 4: 2 ; CHECK-AGG: 5: 6 -; CHECK-AGG-UNWINDER: Binary(noinline-cs-noprobe.perfbin)'s Range Counter: -; CHECK-AGG-UNWINDER: main:1 @ foo -; CHECK-AGG-UNWINDER: (5ff, 62f): 6 -; CHECK-AGG-UNWINDER: (634, 637): 6 -; CHECK-AGG-UNWINDER: (645, 645): 6 -; CHECK-AGG-UNWINDER: main:1 @ foo:3 @ bar -; CHECK-AGG-UNWINDER: (5b0, 5c8): 2 -; CHECK-AGG-UNWINDER: (5b0, 5d7): 4 -; CHECK-AGG-UNWINDER: (5dc, 5e9): 2 -; CHECK-AGG-UNWINDER: (5e5, 5e9): 4 - -; CHECK-AGG-UNWINDER: Binary(noinline-cs-noprobe.perfbin)'s Branch Counter: -; CHECK-AGG-UNWINDER: main:1 @ foo -; CHECK-AGG-UNWINDER: (62f, 5b0): 6 -; CHECK-AGG-UNWINDER: (637, 645): 6 -; CHECK-AGG-UNWINDER: (645, 5ff): 6 -; CHECK-AGG-UNWINDER: main:1 @ foo:3 @ bar -; CHECK-AGG-UNWINDER: (5c8, 5dc): 4 -; CHECK-AGG-UNWINDER: (5d7, 5e5): 4 -; CHECK-AGG-UNWINDER: (5e9, 634): 6 - +; CHECK-AGG-UNWINDER: [main:1 @ foo] +; CHECK-AGG-UNWINDER-NEXT: 3 +; CHECK-AGG-UNWINDER-NEXT: 5ff-62f:6 +; CHECK-AGG-UNWINDER-NEXT: 634-637:6 +; CHECK-AGG-UNWINDER-NEXT: 645-645:6 +; CHECK-AGG-UNWINDER-NEXT: 3 +; CHECK-AGG-UNWINDER-NEXT: 62f->5b0:6 +; CHECK-AGG-UNWINDER-NEXT: 637->645:6 +; CHECK-AGG-UNWINDER-NEXT: 645->5ff:6 +; CHECK-AGG-UNWINDER-NEXT: [main:1 @ foo:3 @ bar] +; CHECK-AGG-UNWINDER-NEXT: 4 +; CHECK-AGG-UNWINDER-NEXT: 5b0-5c8:2 +; CHECK-AGG-UNWINDER-NEXT: 5b0-5d7:4 +; CHECK-AGG-UNWINDER-NEXT: 5dc-5e9:2 +; CHECK-AGG-UNWINDER-NEXT: 5e5-5e9:4 +; CHECK-AGG-UNWINDER-NEXT: 3 +; CHECK-AGG-UNWINDER-NEXT: 5c8->5dc:4 +; CHECK-AGG-UNWINDER-NEXT: 5d7->5e5:4 +; CHECK-AGG-UNWINDER-NEXT: 5e9->634:6 ; CHECK:[main:1 @ foo]:54:0 @@ -60,26 +58,26 @@ ; CHECK: 4: 1 ; CHECK: 5: 3 -; CHECK-UNWINDER: Binary(noinline-cs-noprobe.perfbin)'s Range Counter: -; CHECK-UNWINDER: main:1 @ foo -; CHECK-UNWINDER: (5ff, 62f): 3 -; CHECK-UNWINDER: (634, 637): 3 -; CHECK-UNWINDER: (645, 645): 3 -; CHECK-UNWINDER: main:1 @ foo:3 @ bar -; CHECK-UNWINDER: (5b0, 5c8): 1 -; CHECK-UNWINDER: (5b0, 5d7): 2 -; CHECK-UNWINDER: (5dc, 5e9): 1 -; CHECK-UNWINDER: (5e5, 5e9): 2 - -; CHECK-UNWINDER: Binary(noinline-cs-noprobe.perfbin)'s Branch Counter: -; CHECK-UNWINDER: main:1 @ foo -; CHECK-UNWINDER: (62f, 5b0): 3 -; CHECK-UNWINDER: (637, 645): 3 -; CHECK-UNWINDER: (645, 5ff): 3 -; CHECK-UNWINDER: main:1 @ foo:3 @ bar -; CHECK-UNWINDER: (5c8, 5dc): 2 -; CHECK-UNWINDER: (5d7, 5e5): 2 -; CHECK-UNWINDER: (5e9, 634): 3 + +; CHECK-UNWINDER: [main:1 @ foo] +; CHECK-UNWINDER-NEXT: 3 +; CHECK-UNWINDER-NEXT: 5ff-62f:3 +; CHECK-UNWINDER-NEXT: 634-637:3 +; CHECK-UNWINDER-NEXT: 645-645:3 +; CHECK-UNWINDER-NEXT: 3 +; CHECK-UNWINDER-NEXT: 62f->5b0:3 +; CHECK-UNWINDER-NEXT: 637->645:3 +; CHECK-UNWINDER-NEXT: 645->5ff:3 +; CHECK-UNWINDER-NEXT: [main:1 @ foo:3 @ bar] +; CHECK-UNWINDER-NEXT: 4 +; CHECK-UNWINDER-NEXT: 5b0-5c8:1 +; CHECK-UNWINDER-NEXT: 5b0-5d7:2 +; CHECK-UNWINDER-NEXT: 5dc-5e9:1 +; CHECK-UNWINDER-NEXT: 5e5-5e9:2 +; CHECK-UNWINDER-NEXT: 3 +; CHECK-UNWINDER-NEXT: 5c8->5dc:2 +; CHECK-UNWINDER-NEXT: 5d7->5e5:2 +; CHECK-UNWINDER-NEXT: 5e9->634:3 ; CHECK-MD5: NameTableSection {{.*}} {fixlenmd5} diff --git a/llvm/test/tools/llvm-profgen/noinline-cs-pseudoprobe.test b/llvm/test/tools/llvm-profgen/noinline-cs-pseudoprobe.test --- a/llvm/test/tools/llvm-profgen/noinline-cs-pseudoprobe.test +++ b/llvm/test/tools/llvm-profgen/noinline-cs-pseudoprobe.test @@ -24,20 +24,18 @@ ; CHECK-NEXT: 4: 15 ; CHECK-NEXT: !CFGChecksum: 72617220756 - -; CHECK-UNWINDER: Binary(noinline-cs-pseudoprobe.perfbin)'s Range Counter: -; CHECK-UNWINDER-NEXT: main:2 -; CHECK-UNWINDER-NEXT: (79e, 7bf): 15 -; CHECK-UNWINDER-NEXT: (7c4, 7cf): 15 -; CHECK-UNWINDER-NEXT: main:2 @ foo:8 -; CHECK-UNWINDER-NEXT: (760, 77f): 15 - -; CHECK-UNWINDER: Binary(noinline-cs-pseudoprobe.perfbin)'s Branch Counter: -; CHECK-UNWINDER-NEXT: main:2 -; CHECK-UNWINDER-NEXT: (7bf, 760): 15 -; CHECK-UNWINDER-NEXT: (7cf, 79e): 16 -; CHECK-UNWINDER-NEXT: main:2 @ foo:8 -; CHECK-UNWINDER-NEXT: (77f, 7c4): 17 +; CHECK-UNWINDER: [main:2] +; CHECK-UNWINDER-NEXT: 2 +; CHECK-UNWINDER-NEXT: 79e-7bf:15 +; CHECK-UNWINDER-NEXT: 7c4-7cf:15 +; CHECK-UNWINDER-NEXT: 2 +; CHECK-UNWINDER-NEXT: 7bf->760:15 +; CHECK-UNWINDER-NEXT: 7cf->79e:16 +; CHECK-UNWINDER-NEXT: [main:2 @ foo:8] +; CHECK-UNWINDER-NEXT: 1 +; CHECK-UNWINDER-NEXT: 760-77f:15 +; CHECK-UNWINDER-NEXT: 1 +; CHECK-UNWINDER-NEXT: 77f->7c4:17 ; clang -O3 -fexperimental-new-pass-manager -fuse-ld=lld -fpseudo-probe-for-profiling diff --git a/llvm/test/tools/llvm-profgen/recursion-compression-pseudoprobe.test b/llvm/test/tools/llvm-profgen/recursion-compression-pseudoprobe.test --- a/llvm/test/tools/llvm-profgen/recursion-compression-pseudoprobe.test +++ b/llvm/test/tools/llvm-profgen/recursion-compression-pseudoprobe.test @@ -123,47 +123,48 @@ ; CHECK: 6: 1 fa:1 ; CHECK: !CFGChecksum: 563022570642068 - - -; CHECK-UNWINDER: Binary(recursion-compression-pseudoprobe.perfbin)'s Range Counter: -; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 -; CHECK-UNWINDER: (7a0, 7a7): 1 -; CHECK-UNWINDER: (7a0, 7ab): 3 -; CHECK-UNWINDER: (7b2, 7b5): 1 -; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 -; CHECK-UNWINDER: (7c0, 7d4): 1 -; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 -; CHECK-UNWINDER: (7c0, 7cd): 1 -; CHECK-UNWINDER: (7db, 7e0): 1 -; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa:7 -; CHECK-UNWINDER: (7a0, 7a7): 1 -; CHECK-UNWINDER: (7b2, 7b5): 1 -; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa:7 @ fb:6 -; CHECK-UNWINDER: (7c0, 7cd): 2 -; CHECK-UNWINDER: (7db, 7e0): 1 -; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa:7 @ fb:6 @ fa:7 -; CHECK-UNWINDER: (7a0, 7a7): 1 -; CHECK-UNWINDER: (7b2, 7b5): 1 - -; CHECK-UNWINDER: Binary(recursion-compression-pseudoprobe.perfbin)'s Branch Counter: -; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 -; CHECK-UNWINDER: (7a7, 7b2): 1 -; CHECK-UNWINDER: (7ab, 7a0): 4 -; CHECK-UNWINDER: (7b5, 7c0): 1 -; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 -; CHECK-UNWINDER: (7d4, 7c0): 1 -; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 -; CHECK-UNWINDER: (7cd, 7db): 1 -; CHECK-UNWINDER: (7e0, 7a0): 1 -; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa:7 -; CHECK-UNWINDER: (7a7, 7b2): 1 -; CHECK-UNWINDER: (7b5, 7c0): 1 -; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa:7 @ fb:6 -; CHECK-UNWINDER: (7cd, 7db): 2 -; CHECK-UNWINDER: (7e0, 7a0): 1 -; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa:7 @ fb:6 @ fa:7 -; CHECK-UNWINDER: (7a7, 7b2): 1 -; CHECK-UNWINDER: (7b5, 7c0): 1 +; CHECK-UNWINDER: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5] +; CHECK-UNWINDER-NEXT: 3 +; CHECK-UNWINDER-NEXT: 7a0-7a7:1 +; CHECK-UNWINDER-NEXT: 7a0-7ab:3 +; CHECK-UNWINDER-NEXT: 7b2-7b5:1 +; CHECK-UNWINDER-NEXT: 3 +; CHECK-UNWINDER-NEXT: 7a7->7b2:1 +; CHECK-UNWINDER-NEXT: 7ab->7a0:4 +; CHECK-UNWINDER-NEXT: 7b5->7c0:1 +; CHECK-UNWINDER-NEXT: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6] +; CHECK-UNWINDER-NEXT: 1 +; CHECK-UNWINDER-NEXT: 7c0-7d4:1 +; CHECK-UNWINDER-NEXT: 1 +; CHECK-UNWINDER-NEXT: 7d4->7c0:1 +; CHECK-UNWINDER-NEXT: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8] +; CHECK-UNWINDER-NEXT: 2 +; CHECK-UNWINDER-NEXT: 7c0-7cd:1 +; CHECK-UNWINDER-NEXT: 7db-7e0:1 +; CHECK-UNWINDER-NEXT: 2 +; CHECK-UNWINDER-NEXT: 7cd->7db:1 +; CHECK-UNWINDER-NEXT: 7e0->7a0:1 +; CHECK-UNWINDER-NEXT: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa:7] +; CHECK-UNWINDER-NEXT: 2 +; CHECK-UNWINDER-NEXT: 7a0-7a7:1 +; CHECK-UNWINDER-NEXT: 7b2-7b5:1 +; CHECK-UNWINDER-NEXT: 2 +; CHECK-UNWINDER-NEXT: 7a7->7b2:1 +; CHECK-UNWINDER-NEXT: 7b5->7c0:1 +; CHECK-UNWINDER-NEXT: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa:7 @ fb:6] +; CHECK-UNWINDER-NEXT: 2 +; CHECK-UNWINDER-NEXT: 7c0-7cd:2 +; CHECK-UNWINDER-NEXT: 7db-7e0:1 +; CHECK-UNWINDER-NEXT: 2 +; CHECK-UNWINDER-NEXT: 7cd->7db:2 +; CHECK-UNWINDER-NEXT: 7e0->7a0:1 +; CHECK-UNWINDER-NEXT: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa:7 @ fb:6 @ fa:7] +; CHECK-UNWINDER-NEXT: 2 +; CHECK-UNWINDER-NEXT: 7a0-7a7:1 +; CHECK-UNWINDER-NEXT: 7b2-7b5:1 +; CHECK-UNWINDER-NEXT: 2 +; CHECK-UNWINDER-NEXT: 7a7->7b2:1 +; CHECK-UNWINDER-NEXT: 7b5->7c0:1 ; clang -O3 -fexperimental-new-pass-manager -fuse-ld=lld -fpseudo-probe-for-profiling diff --git a/llvm/tools/llvm-profgen/PerfReader.h b/llvm/tools/llvm-profgen/PerfReader.h --- a/llvm/tools/llvm-profgen/PerfReader.h +++ b/llvm/tools/llvm-profgen/PerfReader.h @@ -609,8 +609,8 @@ // Post process the profile after trace aggregation, we will do simple range // overlap computation for AutoFDO, or unwind for CSSPGO(hybrid sample). virtual void generateRawProfile() = 0; - virtual void writeRawProfile(StringRef Filename); - virtual void writeRawProfile(raw_fd_ostream &OS) = 0; + void writeRawProfile(StringRef Filename); + void writeRawProfile(raw_fd_ostream &OS); ProfiledBinary *Binary = nullptr; @@ -641,7 +641,6 @@ private: // Unwind the hybrid samples after aggregration void unwindSamples(); - void writeRawProfile(raw_fd_ostream &OS) override; }; /* @@ -668,7 +667,6 @@ private: void computeCounterFromLBR(const PerfSample *Sample, uint64_t Repeat); - void writeRawProfile(raw_fd_ostream &OS) override; }; } // end namespace sampleprof diff --git a/llvm/tools/llvm-profgen/PerfReader.cpp b/llvm/tools/llvm-profgen/PerfReader.cpp --- a/llvm/tools/llvm-profgen/PerfReader.cpp +++ b/llvm/tools/llvm-profgen/PerfReader.cpp @@ -18,6 +18,10 @@ cl::desc("Dump the unsumbolized profile to the " "output file. It will show unwinder " "output for CS profile generation.")); +cl::opt ShowRelativeAddress( + "show-relative-address", cl::ReallyHidden, cl::init(true), cl::ZeroOrMore, + cl::desc("Work with `--skip-symbolization` to dump the relative address to " + "image base instead of virtual address.")); extern cl::opt ShowDisassemblyOnly; extern cl::opt ShowSourceLocations; @@ -313,20 +317,6 @@ } } -// Use ordered map to make the output deterministic -using OrderedCounterForPrint = std::map; - -static void printSampleCounter(OrderedCounterForPrint &OrderedCounter, - raw_fd_ostream &OS) { - for (auto Range : OrderedCounter) { - OS << Range.first << "\n"; - for (auto I : Range.second) { - OS << " (" << format("%" PRIx64, I.first.first) << ", " - << format("%" PRIx64, I.first.second) << "): " << I.second << "\n"; - } - } -} - static std::string getContextKeyStr(ContextKey *K, const ProfiledBinary *Binary) { if (const auto *CtxKey = dyn_cast(K)) { @@ -344,35 +334,6 @@ } } -static void printRangeCounter(ContextSampleCounterMap &Counter, - const ProfiledBinary *Binary, - raw_fd_ostream &OS) { - OrderedCounterForPrint OrderedCounter; - for (auto &CI : Counter) { - OrderedCounter[getContextKeyStr(CI.first.getPtr(), Binary)] = - CI.second.RangeCounter; - } - printSampleCounter(OrderedCounter, OS); -} - -static void printBranchCounter(ContextSampleCounterMap &Counter, - const ProfiledBinary *Binary, - raw_fd_ostream &OS) { - OrderedCounterForPrint OrderedCounter; - for (auto &CI : Counter) { - OrderedCounter[getContextKeyStr(CI.first.getPtr(), Binary)] = - CI.second.BranchCounter; - } - printSampleCounter(OrderedCounter, OS); -} - -void HybridPerfReader::writeRawProfile(raw_fd_ostream &OS) { - OS << "Binary(" << Binary->getName().str() << ")'s Range Counter:\n"; - printRangeCounter(SampleCounters, Binary, OS); - OS << "\nBinary(" << Binary->getName().str() << ")'s Branch Counter:\n"; - printBranchCounter(SampleCounters, Binary, OS); -} - void HybridPerfReader::unwindSamples() { std::set AllUntrackedCallsites; for (const auto &Item : AggregatedSamples) { @@ -391,7 +352,7 @@ << format("%" PRIx64, Address) << "\n"; if (SkipSymbolization) - PerfReaderBase::writeRawProfile(OutputFilename); + writeRawProfile(OutputFilename); } bool PerfReaderBase::extractLBRStack(TraceStream &TraceIt, @@ -591,9 +552,13 @@ writeRawProfile(OS); } -void LBRPerfReader::writeRawProfile(raw_fd_ostream &OS) { +// Use ordered map to make the output deterministic +using OrderedCounterForPrint = std::map; + +void PerfReaderBase::writeRawProfile(raw_fd_ostream &OS) { /* Format: + [context string] number of entries in RangeCounter from_1-to_1:count_1 from_2-to_2:count_2 @@ -606,17 +571,42 @@ src_n->dst_n:count_n */ - SampleCounter &Counter = SampleCounters.begin()->second; - OS << Counter.RangeCounter.size() << "\n"; - for (auto I : Counter.RangeCounter) { - OS << Twine::utohexstr(I.first.first) << "-" - << Twine::utohexstr(I.first.second) << ":" << I.second << "\n"; - } + OrderedCounterForPrint OrderedCounters; + for (auto &CI : SampleCounters) { + OrderedCounters[getContextKeyStr(CI.first.getPtr(), Binary)] = &CI.second; + } + + for (auto &CI : OrderedCounters) { + // Context string key + if (!CI.first.empty()) + OS << "[" << CI.first << "]" + << "\n"; + + SampleCounter &Counter = *CI.second; + + OS << Counter.RangeCounter.size() << "\n"; + for (auto I : Counter.RangeCounter) { + uint64_t Start = ShowRelativeAddress + ? I.first.first + : Binary->offsetToVirtualAddr(I.first.first); + uint64_t End = ShowRelativeAddress + ? I.first.second + : Binary->offsetToVirtualAddr(I.first.second); + OS << Twine::utohexstr(Start) << "-" << Twine::utohexstr(End) << ":" + << I.second << "\n"; + } - OS << Counter.BranchCounter.size() << "\n"; - for (auto I : Counter.BranchCounter) { - OS << Twine::utohexstr(I.first.first) << "->" - << Twine::utohexstr(I.first.second) << ":" << I.second << "\n"; + OS << Counter.BranchCounter.size() << "\n"; + for (auto I : Counter.BranchCounter) { + uint64_t Source = ShowRelativeAddress + ? I.first.first + : Binary->offsetToVirtualAddr(I.first.first); + uint64_t Target = ShowRelativeAddress + ? I.first.second + : Binary->offsetToVirtualAddr(I.first.second); + OS << Twine::utohexstr(Source) << "->" << Twine::utohexstr(Target) << ":" + << I.second << "\n"; + } } }