aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Basic/SourceManager.cpp
diff options
context:
space:
mode:
authorHaojian Wu <hokein.wu@gmail.com>2022-10-05 11:31:04 +0200
committerHaojian Wu <hokein.wu@gmail.com>2022-10-06 10:15:09 +0200
commitdf61bb271af9ad6e61c1cd470ea6f4255b2182c7 (patch)
tree54a38cd1f8dc0ceb4352b02a35b5b2eee2cce380 /clang/lib/Basic/SourceManager.cpp
parente09b0589a9c514e1915f3841300fcc95cf4936b7 (diff)
downloadllvm-df61bb271af9ad6e61c1cd470ea6f4255b2182c7.zip
llvm-df61bb271af9ad6e61c1cd470ea6f4255b2182c7.tar.gz
llvm-df61bb271af9ad6e61c1cd470ea6f4255b2182c7.tar.bz2
[SourceManager] Improve getFileIDLoaded.
Similar to getFileIDLocal patch, but for the version for load module. Test with clangd (building AST with preamble), FileID scans in binary search is reduced: SemaExpr.cpp: 142K -> 137K (-3%) FindTarget.cpp: 368K -> 343K (-6%) Differential Revision: https://reviews.llvm.org/D135258
Diffstat (limited to 'clang/lib/Basic/SourceManager.cpp')
-rw-r--r--clang/lib/Basic/SourceManager.cpp34
1 files changed, 18 insertions, 16 deletions
diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp
index de217a9..32234b5 100644
--- a/clang/lib/Basic/SourceManager.cpp
+++ b/clang/lib/Basic/SourceManager.cpp
@@ -869,36 +869,38 @@ FileID SourceManager::getFileIDLoaded(SourceLocation::UIntTy SLocOffset) const {
}
// Essentially the same as the local case, but the loaded array is sorted
- // in the other direction.
+ // in the other direction (decreasing order).
+ // GreaterIndex is the one where the offset is greater, which is actually a
+ // lower index!
+ unsigned GreaterIndex = 0;
+ unsigned LessIndex = LoadedSLocEntryTable.size();
+ if (LastFileIDLookup.ID < 0) {
+ // Prune the search space.
+ int LastID = LastFileIDLookup.ID;
+ if (getLoadedSLocEntryByID(LastID).getOffset() > SLocOffset)
+ GreaterIndex =
+ (-LastID - 2) + 1; // Exclude LastID, else we would have hit the cache
+ else
+ LessIndex = -LastID - 2;
+ }
// First do a linear scan from the last lookup position, if possible.
- unsigned I;
- int LastID = LastFileIDLookup.ID;
- if (LastID >= 0 || getLoadedSLocEntryByID(LastID).getOffset() < SLocOffset)
- I = 0;
- else
- I = (-LastID - 2) + 1;
-
unsigned NumProbes;
bool Invalid = false;
- for (NumProbes = 0; NumProbes < 8; ++NumProbes, ++I) {
+ for (NumProbes = 0; NumProbes < 8; ++NumProbes, ++GreaterIndex) {
// Make sure the entry is loaded!
- const SrcMgr::SLocEntry &E = getLoadedSLocEntry(I, &Invalid);
+ const SrcMgr::SLocEntry &E = getLoadedSLocEntry(GreaterIndex, &Invalid);
if (Invalid)
return FileID(); // invalid entry.
if (E.getOffset() <= SLocOffset) {
- FileID Res = FileID::get(-int(I) - 2);
+ FileID Res = FileID::get(-int(GreaterIndex) - 2);
LastFileIDLookup = Res;
NumLinearScans += NumProbes + 1;
return Res;
}
}
- // Linear scan failed. Do the binary search. Note the reverse sorting of the
- // table: GreaterIndex is the one where the offset is greater, which is
- // actually a lower index!
- unsigned GreaterIndex = I;
- unsigned LessIndex = LoadedSLocEntryTable.size();
+ // Linear scan failed. Do the binary search.
NumProbes = 0;
while (true) {
++NumProbes;