Polonius Roadmap


Extending Polonius to cover the full semantics

  • Extend analysis to compute use-live and drop-live variables at each point
  • Extend rustc to emit use, drop, and def facts for variables
  • Extend rustc to emit types of variables, or at least regions that appear in those types
  • Combine to compute which regions are live at which point
  • Land changes to rustc
  • Extend drop-live analysis to consider initialization
  • Integrating move / overwrite analysis (a la Lark)
  • Describe desired rules
  • Generate required facts and implement rules to generate errors in polonius
  • Report move errors from rustc
  • Handling higher-ranked things (intersects universes and traits group)
  • currently on hold
  • Integrating outlives relations (blogpost)
  • Validating correctness
  • rustc tests: lqd has started an analysis of rustc’s test suite behaviour under `-Zpolonius`
  • Cover Polonius’ behaviour in a lot more tests, in both polonius and rustc repos

Benchmarking suite

  • Instrument rustc to dump timing measurements + tuple counts for each fn in a crate
  • Assemble data into a spreadsheet and attempt to select outlier functions
  • Extract data from them and store into polonius repository to form a benchmarking suite
  • Bonus: modify travis setup to do measurements =)

Rustc Performance

  • Identify outliers in performance + memory usage
  • Examine outliers to characterize why they are slow
  • Identify "common case" overhead and some representative tests
  • Try to figure out why that is slow
  • Extract the facts and do isolated testing of Polonius
  • Explore the ‘location insensitive first’ variant
  • Initially, just use a filter for whether to try the more complex variants
  • Later, can we use the more complex variants to 


  • What design document do we want and when?
  • Videos and things to try and explain
  • Introduction to Polonius (sort of done, Niko has to post)
  • More complex examples, like the dreaded #47680.
  • Walk through a simple example and connect it to the code
  • here is where we compute this relation
  • here is how data is transferred between rustc
  • here is how the datafrog code works
  • How datafrog-opt works and how it relates to the naive check