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