perf: Fix the perf.data file output
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 24 May 2016 20:20:03 +0000 (16:20 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jun 2016 15:48:37 +0000 (11:48 -0400)
commitf1c61e013418d4086d8e703b941c12188d4d3236
treefd86532bb9dcf029ed3511c42a3de555d07b97cc
parentf2386f88c935d9947457c3655691ae27a415cf4d
perf: Fix the perf.data file output

The main problem was that the features headers (e.g. HEADER_HOSTNAME) just
didn't work at all.  The headers are supposed to have a perf_file_section
for each header, which they were missing.  The other header issue was that
the feature header section is supposed to be after the data section.  The
three big sections (attrs, data, event_types) all have file sections in the
main header, but the features are just assumed to be after the data
section (based on linux perf's code).

The latter bit implies that the data section is last among the three
sections.  Who knows what the order for them really is, but since they all
have perf_file_sections, then we should be good with just keeping data
last.

The other major thing that seemed messed up was the rel_offset.  The old
code was just looking at it once and using it for all of the three big
sections.  Each section has its own peculiar relocations.  The trickiest
is that the attr MF's relocs are all relative to the attr_id MF.  Yikes.
I think we were getting away with it since attrs was the only one with
relocations.

Other than that, there's just some cleanup.  For instance, when setting a
feat header, we should set the PH bit then instead of deferring it.  And
when building the perf_file_sections for the three big sections, we should
always do it, not condition on size > 0.  Just set the damn values.  That
clarifies and simplifies the code a lot, instead of having some mysterious
'rel_offset' sitting around.  'rel' to what?

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/profile/perf/perfconv.c
tools/profile/perf/perfconv.h