[llvm-profgen] Decoding pseudo probe for profiled function only.
authorHongtao Yu <hoy@fb.com>
Wed, 23 Mar 2022 19:36:44 +0000 (12:36 -0700)
committerHongtao Yu <hoy@fb.com>
Wed, 23 Mar 2022 21:15:11 +0000 (14:15 -0700)
commit3f97016857b0305294f3a55ea220884fb50ce033
tree3c5afd53b31a9f558b4e26190419913dfde0a636
parentd90a3fcacda7257b26ac32350353410f79be6d2b
[llvm-profgen] Decoding pseudo probe for profiled function only.

Complete pseudo probes decoding can result in large memory usage. In practice only a small porting of the decoded probes are used in profile generation. I'm changing the full decoding mode to be decoding for profiled functions only, though we still do a full scan of the .pseudoprobe section due to a missing table-of-content but we don't have to build the in-memory data structure for functions not sampled.

To build the in-memory data structure for profiled functions only, I'm rewriting the previous non-recursive probe decoding logic to be recursive. This is easy to read and maintain.

I also have to change the previous representation of unsymbolized context from probe-based stack to address-based stack since the profiled functions are unknown yet by the time of virtual unwinding. The address-based stack will be converted to probe-based stack after virtual unwinding and on-demand probe decoding.

I'm seeing 20GB memory is saved for one of our internal large service.

Reviewed By: wenlei

Differential Revision: https://reviews.llvm.org/D121643
llvm/include/llvm/MC/MCPseudoProbe.h
llvm/lib/MC/MCPseudoProbe.cpp
llvm/test/tools/llvm-profgen/noinline-cs-pseudoprobe.test
llvm/test/tools/llvm-profgen/recursion-compression-pseudoprobe.test
llvm/tools/llvm-profgen/PerfReader.cpp
llvm/tools/llvm-profgen/PerfReader.h
llvm/tools/llvm-profgen/ProfileGenerator.cpp
llvm/tools/llvm-profgen/ProfileGenerator.h
llvm/tools/llvm-profgen/ProfiledBinary.cpp
llvm/tools/llvm-profgen/ProfiledBinary.h