On Windows loading preamble and caching global completion takes a while.
This is the way to improve it.
Please comment if I misuse something.
You can use an llvm::StringMap instead.
Why is clear in an else here? We always create a new SourceManager in this function, so the previously cached locations will be invalid, so shouldn't we always clear the cache before TranslateStoredDiagnostics?
I will change that
When we load diagnostics that means that preamble has not changed. Doesn't that mean that source locations can be reused? What can cause them to become invalid?
I can keep cache only during TranslateStoredDiagnostics calls but in that case performance improvement is way less.
But if you say that current solution is invalid I will do that
You're right actually, we can reuse them. We already do make that assumption that the preamble's source locations can be reused in checkAndSanitizeDiags. This code is fine then, sorry about the confusion.
You should mention in the comment for the SrcLocCache that we cache only the source locations from the preamble as we can guarantee that they will stay valid when the source manager is re-created.
"what kind of performance benefits do you get for the preamble load times?"
In cases where many windows headers are included preamble loading takes almost the half of reparse time. With this fix time to load preamble goes towards zero.