- file output
  - check whether getting rid of varint encoding speed up the writer
    (we compress using Snappy anyway)
- add option to set $^P to
  - 0x200 descriptive names for anonymous subroutines
  - 0x100 descriptive names for eval ""
  - 0x10  keep information about the definition line for a subroutine
  - 0x400 save source code for all files (optionally dumping it as soon
    as possible)
- command line options for analysis script
- generated code containing #line directives
  - it might be useful to have both the original and generated code
    in the report, with some way to toggle between the two
- metadata/segmenting
  - supports writing overlapping sections
  - metadata does not belong to a section (probably not an issue, but
    it needs better handling in the aggregation phase)
  - overlapping/nested sections are not handled during aggregation
- some serious benchmarking
  - add a fast benchmark to be used during development and a slow more
    realistic one for release
- decide what to do for multiple distinct evals mapping to the same
  logical file (with overlapping and non-overlapping line ranges)
  (t/382_evil_source_mapping.t cases in evil-source-mapping branch)
- subs with same optree and different name via Sub::Name are not aggregated;
  this is a sensible default, but having some way of detect the situation
  might be nice (CvROOT() might be a starting point)

- detect multiple evals with the same #line directive and different source code
- closure aggregation
- aggregate evals without source code, based on caller/callees
- handle overlapping/nested sections
- make aggregation code reusable both as a script and in a web application
- file reader: Better error reporting
  - treat truncated files as a closed stream
- test case for 9d4110d016a72fabfb5cd45c4ae97468c9070f51
- test case for 8cca10b0053cf3a2e741fae7adc7f0ed3a1fea3c
- merge xs:<file> with real file entries, if there is a matching one
- split the Aggregator class in two (aggregation and loading of the final report)
- rewrite NameMap in C++ (leaving the loading/saving/merging in Perl for convenience)
- add test for NameMap eval mapping
- revisit the way the mutable genealogy hash is shared
  (provide an API and/or rewrite in C++)
- add an API to read traces by section, and remove the horrible hack of returning
  a fake empty trace when a section starts/ends
    - add some kind of ->watch_sections("name1", "name2") to the reader,
      with the option of returning data both inside and outside the section
    - instead of returning a single trace, the reader now returns a section,
      with included metadata; this means a sample can be potentially returned
      multiple times in different sections
    - the aggregator class needs to be tweaked but most of the logic should
      remain the same
- rework metadata API
  - per-aggregate one requires a save
  - per-report one requires a merge
  - test it
- submit flamegraph.pl changes upstream
- test for 372d862d8bd6e5e46b0e08c8ad59aab9837f48b3, and aggregation is still
  generating way too many "Unable to find reverse file for '$file'" for evals
- test for discard_expired_process_data
  - also garbage-collect eval source code
  - merge and discard evals with the same name and no source mapping
    if the process that generated them is older than some threshold

- sporadic t/032_xsubs.t failure:
  "Invalid input file: Found stray sub-frame tag without sample-start tag"
