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-noprobe.test b/llvm/test/tools/llvm-profgen/inline-cs-noprobe.test --- a/llvm/test/tools/llvm-profgen/inline-cs-noprobe.test +++ b/llvm/test/tools/llvm-profgen/inline-cs-noprobe.test @@ -1,5 +1,5 @@ ; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --output=%t --skip-symbolization --profile-summary-cold-count=0 -| FileCheck %s --input-file %t --check-prefix=CHECK-UNWINDER +; RUN: FileCheck %s --input-file %t --check-prefix=CHECK-UNWINDER ; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --output=%t --profile-summary-cold-count=0 ; RUN: FileCheck %s --input-file %t @@ -11,19 +11,19 @@ ; CHECK:[main:1 @ foo:3.1 @ bar]:84:0 ; CHECK: 1: 14 -; CHECK-UNWINDER: Binary(inline-cs-noprobe.perfbin)'s Range Counter: -; CHECK-UNWINDER: main:1 @ foo -; CHECK-UNWINDER: (670, 6ad): 1 -; CHECK-UNWINDER: (67e, 69b): 1 -; CHECK-UNWINDER: (67e, 6ad): 13 -; CHECK-UNWINDER: (6bd, 6c8): 14 -; CHECK-UNWINDER: main:1 @ foo:3.1 @ bar -; CHECK-UNWINDER: (6af, 6bb): 14 - -; CHECK-UNWINDER: Binary(inline-cs-noprobe.perfbin)'s Branch Counter: -; CHECK-UNWINDER: main:1 @ foo -; CHECK-UNWINDER: (69b, 670): 1 -; CHECK-UNWINDER: (6c8, 67e): 15 +; CHECK-UNWINDER: [main:1 @ foo] +; CHECK-UNWINDER: 4 +; CHECK-UNWINDER: 670-6ad:1 +; CHECK-UNWINDER: 67e-69b:1 +; CHECK-UNWINDER: 67e-6ad:13 +; CHECK-UNWINDER: 6bd-6c8:14 +; CHECK-UNWINDER: 2 +; CHECK-UNWINDER: 69b->670:1 +; CHECK-UNWINDER: 6c8->67e:15 +; CHECK-UNWINDER: [main:1 @ foo:3.1 @ bar] +; CHECK-UNWINDER: 1 +; CHECK-UNWINDER: 6af-6bb:14 +; CHECK-UNWINDER: 0 ; original code: ; clang -O3 -g test.c -o a.out 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 --use-offset=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 @@ -612,8 +612,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; @@ -646,7 +646,6 @@ private: // Unwind the hybrid samples after aggregration void unwindSamples(); - void writeRawProfile(raw_fd_ostream &OS) override; }; /* @@ -673,7 +672,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 @@ -20,6 +20,10 @@ cl::desc("Dump the unsymbolized profile to the " "output file. It will show unwinder " "output for CS profile generation.")); +cl::opt UseOffset("use-offset", cl::ReallyHidden, cl::init(true), + cl::ZeroOrMore, + cl::desc("Work with `--skip-symbolization` to dump the " + "offset instead of virtual address.")); extern cl::opt ShowDisassemblyOnly; extern cl::opt ShowSourceLocations; @@ -328,20 +332,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)) { @@ -359,35 +349,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) { @@ -406,7 +367,7 @@ << format("%" PRIx64, Address) << "\n"; if (SkipSymbolization) - PerfReaderBase::writeRawProfile(OutputFilename); + writeRawProfile(OutputFilename); } bool PerfReaderBase::extractLBRStack(TraceStream &TraceIt, @@ -629,9 +590,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 @@ -644,17 +609,37 @@ 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; + } + + auto SCounterPrinter = [&](RangeSample Counter, StringRef Separator, + uint32_t Indent) { + OS.indent(Indent); + OS << Counter.size() << "\n"; + for (auto I : Counter) { + uint64_t Start = UseOffset ? I.first.first + : Binary->offsetToVirtualAddr(I.first.first); + uint64_t End = UseOffset ? I.first.second + : Binary->offsetToVirtualAddr(I.first.second); + OS.indent(Indent); + OS << Twine::utohexstr(Start) << Separator << Twine::utohexstr(End) << ":" + << I.second << "\n"; + } + }; + + for (auto &CI : OrderedCounters) { + uint32_t Indent = 0; + if (!CI.first.empty()) { + // Context string key + OS << "[" << CI.first << "]\n"; + Indent = 2; + } - OS << Counter.BranchCounter.size() << "\n"; - for (auto I : Counter.BranchCounter) { - OS << Twine::utohexstr(I.first.first) << "->" - << Twine::utohexstr(I.first.second) << ":" << I.second << "\n"; + SampleCounter &Counter = *CI.second; + SCounterPrinter(Counter.RangeCounter, "-", Indent); + SCounterPrinter(Counter.BranchCounter, "->", Indent); } }