This change aims at supporting LBR only sample perf script which is used for regular(Non-CS) profile generation. A LBR perf script includes a batch of LBR sample which starts with a frame pointer and a group of 32 LBR entries is followed. The FROM/TO LBR pair and the range between two consecutive entries (the former entry's TO and the latter entry's FROM) will be used to infer function profile info.
An example of LBR perf script(created by perf script -F ip,brstack -i perf.data)
40062f 0x40062f/0x4005b0/P/-/-/9 0x400645/0x4005ff/P/-/-/1 0x400637/0x400645/P/-/-/1 ... 4005d7 0x4005d7/0x4005e5/P/-/-/8 0x40062f/0x4005b0/P/-/-/6 0x400645/0x4005ff/P/-/-/1 ... ...
For implementation:
- Extended a new child class LBRPerfReader for the sample parsing, reused all the functionalities in extractLBRStack except for an extension to parsing leading instruction pointer.
- HybridSample is reused(just leave the call stack empty) and the parsed samples is still aggregated in AggregatedSamples. After that, range samples, branch sample, address samples are computed and recorded.
- Reused ContextSampleCounterMap to store the raw profile, since it's no need to aggregation by context, here it just registered one sample counter with a fake context key.
- Unified to use show-raw-profile instead of show-unwinder-output to dump the intermediate raw profile, see the comments of the format of the raw profile. For CS profile, it remains to output the unwinder output.
Profile generation part will come soon.
Do we really need this? RangeCounter should cover addresses?