diff --git a/llvm/test/tools/llvm-profgen/Inputs/recursion-compression-pseudoprobe-nommap.perfscript b/llvm/test/tools/llvm-profgen/Inputs/recursion-compression-pseudoprobe-nommap.perfscript new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-profgen/Inputs/recursion-compression-pseudoprobe-nommap.perfscript @@ -0,0 +1,22 @@ + + 2017db + 2017ba + 2017e5 + 2017ba + 2017e5 + 2017d9 + 2017ba + 2017b0 + 2017b0 + 2017b0 + 2017b0 + 2017b0 + 2017b0 + 2017b0 + 2017b0 + 2017e5 + 2017d9 + 201847 + 7fcb072a67c3 + 5541f689495641d7 + 0x2017cd/0x2017db/P/-/-/0 0x2017b5/0x2017c0/P/-/-/0 0x2017a7/0x2017b2/P/-/-/0 0x2017e0/0x2017a0/P/-/-/0 0x2017cd/0x2017db/P/-/-/0 0x2017b5/0x2017c0/P/-/-/0 0x2017a7/0x2017b2/P/-/-/0 0x2017e0/0x2017a0/P/-/-/0 0x2017cd/0x2017db/P/-/-/0 0x2017d4/0x2017c0/P/-/-/0 0x2017b5/0x2017c0/P/-/-/0 0x2017a7/0x2017b2/P/-/-/0 0x2017ab/0x2017a0/P/-/-/0 0x2017ab/0x2017a0/P/-/-/0 0x2017ab/0x2017a0/P/-/-/0 0x2017ab/0x2017a0/P/-/-/0 diff --git a/llvm/test/tools/llvm-profgen/mmapEvent.test b/llvm/test/tools/llvm-profgen/mmapEvent.test --- a/llvm/test/tools/llvm-profgen/mmapEvent.test +++ b/llvm/test/tools/llvm-profgen/mmapEvent.test @@ -1,5 +1,7 @@ ; REQUIRES: x86-registered-target ; RUN: llvm-profgen --perfscript=%s --binary=%S/Inputs/inline-cs-pseudoprobe.perfbin --output=%t --show-mmap-events | FileCheck %s +; RUN: llvm-profgen --perfscript=%s --binary=%S/Inputs/inline-cs-pseudoprobe.perfbin --output=%t --show-mmap-events --ignore-mmap-events | FileCheck %s --allow-empty -check-prefix=CHECK-IGNORE + PERF_RECORD_MMAP2 2580483/2580483: [0x400000(0x1000) @ 0 103:01 539973862 1972407324]: r-xp /home/a.out PERF_RECORD_MMAP2 2580483/2580483: [0x7f2505b40000(0x224000) @ 0 08:04 19532214 4169021329]: r-xp /usr/lib64/ld-2.17.so @@ -29,3 +31,5 @@ ; CHECK: Mmap: Binary /usr/lib64/perf_fopen_hook.so loaded at 0x7f2505d56000 ; CHECK: Mmap: Binary /home/hoy/test/dlopen/helper.so loaded at 0x7f2505156000 ; CHECK: Mmap: Binary /home/hoy/test/dlopen/helper.so loaded at 0x7f2505156000 + +; CHECK-IGNORE-NOT: Mmap: Binary /home/a.out loaded at 0x400000 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 @@ -3,6 +3,9 @@ ; RUN: FileCheck %s --input-file %t -check-prefix=CHECK-UNCOMPRESS ; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/recursion-compression-pseudoprobe.perfscript --binary=%S/Inputs/recursion-compression-pseudoprobe.perfbin --output=%t --show-unwinder-output --profile-summary-cold-count=0 | FileCheck %s --check-prefix=CHECK-UNWINDER ; RUN: FileCheck %s --input-file %t +; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/recursion-compression-pseudoprobe-nommap.perfscript --binary=%S/Inputs/recursion-compression-pseudoprobe.perfbin --output=%t --show-unwinder-output --profile-summary-cold-count=0 --ignore-mmap-events | FileCheck %s --check-prefix=CHECK-UNWINDER +; RUN: FileCheck %s --input-file %t + ; CHECK-UNCOMPRESS: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:6 @ fa:8 @ fa:7 @ fb:6 @ fa]:4:1 ; CHECK-UNCOMPRESS: 1: 1 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 @@ -13,6 +13,11 @@ cl::init(false), cl::ZeroOrMore, cl::desc("Print binary load events.")); +static cl::opt IgnoreMMapEvents( + "ignore-mmap-events", cl::ReallyHidden, cl::init(false), cl::ZeroOrMore, + cl::desc("Ignore to parse MMap(binary load) events but instead assume " + "binary is always loaded at the preferred address.")); + static cl::opt ShowUnwinderOutput("show-unwinder-output", cl::ReallyHidden, cl::init(false), cl::ZeroOrMore, @@ -317,7 +322,15 @@ exitWithError(ErrorMsg); } - return Ret.first->second; + ProfiledBinary &B = Ret.first->second; + if (IgnoreMMapEvents) { + // Set the base address to prefered address when ignore parsing mmap events. + uint64_t PreferredAddr = B.getPreferredBaseAddress(); + AddrToBinaryMap[PreferredAddr] = &B; + B.setBaseAddress(PreferredAddr); + } + + return B; } void PerfReaderBase::updateBinaryAddress(const MMapEvent &Event) { @@ -649,6 +662,10 @@ } void PerfReaderBase::parseMMap2Event(TraceStream &TraceIt) { + if (IgnoreMMapEvents) { + TraceIt.advance(); + return; + } // Parse a line like: // PERF_RECORD_MMAP2 2113428/2113428: [0x7fd4efb57000(0x204000) @ 0 // 08:04 19532229 3585508847]: r-xp /usr/lib64/libdl-2.17.so