xref: /llvm-project/clang/lib/Serialization/InMemoryModuleCache.cpp (revision 8bef5cd49a8bb66b777cc3c51f9fb31bffeaa580)
1 //===- InMemoryModuleCache.cpp - Cache for loaded memory buffers ----------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "clang/Serialization/InMemoryModuleCache.h"
10 #include "llvm/Support/MemoryBuffer.h"
11 
12 using namespace clang;
13 
14 llvm::MemoryBuffer &
15 InMemoryModuleCache::addBuffer(llvm::StringRef Filename,
16                                std::unique_ptr<llvm::MemoryBuffer> Buffer) {
17   auto Insertion = PCMs.insert({Filename, PCM{std::move(Buffer), NextIndex++}});
18   assert(Insertion.second && "Already has a buffer");
19   return *Insertion.first->second.Buffer;
20 }
21 
22 llvm::MemoryBuffer *
23 InMemoryModuleCache::lookupBuffer(llvm::StringRef Filename) {
24   auto I = PCMs.find(Filename);
25   if (I == PCMs.end())
26     return nullptr;
27   return I->second.Buffer.get();
28 }
29 
30 bool InMemoryModuleCache::isBufferFinal(llvm::StringRef Filename) {
31   auto I = PCMs.find(Filename);
32   if (I == PCMs.end())
33     return false;
34   return I->second.Index < FirstRemovableIndex;
35 }
36 
37 bool InMemoryModuleCache::tryToRemoveBuffer(llvm::StringRef Filename) {
38   auto I = PCMs.find(Filename);
39   assert(I != PCMs.end() && "No buffer to remove...");
40   if (I->second.Index < FirstRemovableIndex)
41     return true;
42 
43   PCMs.erase(I);
44   return false;
45 }
46 
47 void InMemoryModuleCache::finalizeCurrentBuffers() {
48   FirstRemovableIndex = NextIndex;
49 }
50