Hello Gabor,
We still use a file-by-file approach so we don't build a full AST but merging ASTs of analyzed callees only where possible. We build a mapping showing what file contains required functions. Then, we analyze a project file-by-file. During analysis, we import this definition to our TU if we meet a call with a callee definition in another file, and continue analysis as usually.
This approach seems to work. It should get much better performance after implementation of summary serialization due to summary inter-TU reusage. We don't build a full project AST but this is not a memory bottleneck: a real bottleneck currently is function summaries.
Currently we're working on upstreaming our ASTImporter work. This work is slow enough because it requires massive test writing (ASTImporter lacks tests now). But we hope, it will become available for all clang users who needs it.