Level by level: making flow- and context-sensitive pointer analysis scalable for millions of lines of code