18bef5cd4SDuncan P. N. Exon Smith //===- InMemoryModuleCache.cpp - Cache for loaded memory buffers ----------===// 28bef5cd4SDuncan P. N. Exon Smith // 38bef5cd4SDuncan P. N. Exon Smith // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 48bef5cd4SDuncan P. N. Exon Smith // See https://llvm.org/LICENSE.txt for license information. 58bef5cd4SDuncan P. N. Exon Smith // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 68bef5cd4SDuncan P. N. Exon Smith // 78bef5cd4SDuncan P. N. Exon Smith //===----------------------------------------------------------------------===// 88bef5cd4SDuncan P. N. Exon Smith 98bef5cd4SDuncan P. N. Exon Smith #include "clang/Serialization/InMemoryModuleCache.h" 108bef5cd4SDuncan P. N. Exon Smith #include "llvm/Support/MemoryBuffer.h" 118bef5cd4SDuncan P. N. Exon Smith 128bef5cd4SDuncan P. N. Exon Smith using namespace clang; 138bef5cd4SDuncan P. N. Exon Smith 14*57a2eaf3SRumeet Dhindsa InMemoryModuleCache::State getPCMState(llvm::StringRef Filename) const15*57a2eaf3SRumeet DhindsaInMemoryModuleCache::getPCMState(llvm::StringRef Filename) const { 16*57a2eaf3SRumeet Dhindsa auto I = PCMs.find(Filename); 17*57a2eaf3SRumeet Dhindsa if (I == PCMs.end()) 18*57a2eaf3SRumeet Dhindsa return Unknown; 19*57a2eaf3SRumeet Dhindsa if (I->second.IsFinal) 20*57a2eaf3SRumeet Dhindsa return Final; 21*57a2eaf3SRumeet Dhindsa return I->second.Buffer ? Tentative : ToBuild; 22*57a2eaf3SRumeet Dhindsa } 23*57a2eaf3SRumeet Dhindsa 248bef5cd4SDuncan P. N. Exon Smith llvm::MemoryBuffer & addPCM(llvm::StringRef Filename,std::unique_ptr<llvm::MemoryBuffer> Buffer)250a2be46cSDuncan P. N. Exon SmithInMemoryModuleCache::addPCM(llvm::StringRef Filename, 268bef5cd4SDuncan P. N. Exon Smith std::unique_ptr<llvm::MemoryBuffer> Buffer) { 270a2be46cSDuncan P. N. Exon Smith auto Insertion = PCMs.insert(std::make_pair(Filename, std::move(Buffer))); 280a2be46cSDuncan P. N. Exon Smith assert(Insertion.second && "Already has a PCM"); 298bef5cd4SDuncan P. N. Exon Smith return *Insertion.first->second.Buffer; 308bef5cd4SDuncan P. N. Exon Smith } 318bef5cd4SDuncan P. N. Exon Smith 320a2be46cSDuncan P. N. Exon Smith llvm::MemoryBuffer & addBuiltPCM(llvm::StringRef Filename,std::unique_ptr<llvm::MemoryBuffer> Buffer)33*57a2eaf3SRumeet DhindsaInMemoryModuleCache::addBuiltPCM(llvm::StringRef Filename, 340a2be46cSDuncan P. N. Exon Smith std::unique_ptr<llvm::MemoryBuffer> Buffer) { 350a2be46cSDuncan P. N. Exon Smith auto &PCM = PCMs[Filename]; 360a2be46cSDuncan P. N. Exon Smith assert(!PCM.IsFinal && "Trying to override finalized PCM?"); 37*57a2eaf3SRumeet Dhindsa assert(!PCM.Buffer && "Trying to override tentative PCM?"); 380a2be46cSDuncan P. N. Exon Smith PCM.Buffer = std::move(Buffer); 390a2be46cSDuncan P. N. Exon Smith PCM.IsFinal = true; 400a2be46cSDuncan P. N. Exon Smith return *PCM.Buffer; 410a2be46cSDuncan P. N. Exon Smith } 420a2be46cSDuncan P. N. Exon Smith 438bef5cd4SDuncan P. N. Exon Smith llvm::MemoryBuffer * lookupPCM(llvm::StringRef Filename) const440a2be46cSDuncan P. N. Exon SmithInMemoryModuleCache::lookupPCM(llvm::StringRef Filename) const { 458bef5cd4SDuncan P. N. Exon Smith auto I = PCMs.find(Filename); 468bef5cd4SDuncan P. N. Exon Smith if (I == PCMs.end()) 478bef5cd4SDuncan P. N. Exon Smith return nullptr; 488bef5cd4SDuncan P. N. Exon Smith return I->second.Buffer.get(); 498bef5cd4SDuncan P. N. Exon Smith } 508bef5cd4SDuncan P. N. Exon Smith isPCMFinal(llvm::StringRef Filename) const510a2be46cSDuncan P. N. Exon Smithbool InMemoryModuleCache::isPCMFinal(llvm::StringRef Filename) const { 52*57a2eaf3SRumeet Dhindsa return getPCMState(Filename) == Final; 538bef5cd4SDuncan P. N. Exon Smith } 548bef5cd4SDuncan P. N. Exon Smith shouldBuildPCM(llvm::StringRef Filename) const55*57a2eaf3SRumeet Dhindsabool InMemoryModuleCache::shouldBuildPCM(llvm::StringRef Filename) const { 56*57a2eaf3SRumeet Dhindsa return getPCMState(Filename) == ToBuild; 57*57a2eaf3SRumeet Dhindsa } 58*57a2eaf3SRumeet Dhindsa tryToDropPCM(llvm::StringRef Filename)59*57a2eaf3SRumeet Dhindsabool InMemoryModuleCache::tryToDropPCM(llvm::StringRef Filename) { 608bef5cd4SDuncan P. N. Exon Smith auto I = PCMs.find(Filename); 610a2be46cSDuncan P. N. Exon Smith assert(I != PCMs.end() && "PCM to remove is unknown..."); 620a2be46cSDuncan P. N. Exon Smith 630a2be46cSDuncan P. N. Exon Smith auto &PCM = I->second; 64*57a2eaf3SRumeet Dhindsa assert(PCM.Buffer && "PCM to remove is scheduled to be built..."); 65*57a2eaf3SRumeet Dhindsa 660a2be46cSDuncan P. N. Exon Smith if (PCM.IsFinal) 678bef5cd4SDuncan P. N. Exon Smith return true; 688bef5cd4SDuncan P. N. Exon Smith 69*57a2eaf3SRumeet Dhindsa PCM.Buffer.reset(); 708bef5cd4SDuncan P. N. Exon Smith return false; 718bef5cd4SDuncan P. N. Exon Smith } 728bef5cd4SDuncan P. N. Exon Smith finalizePCM(llvm::StringRef Filename)730a2be46cSDuncan P. N. Exon Smithvoid InMemoryModuleCache::finalizePCM(llvm::StringRef Filename) { 740a2be46cSDuncan P. N. Exon Smith auto I = PCMs.find(Filename); 750a2be46cSDuncan P. N. Exon Smith assert(I != PCMs.end() && "PCM to finalize is unknown..."); 760a2be46cSDuncan P. N. Exon Smith 770a2be46cSDuncan P. N. Exon Smith auto &PCM = I->second; 780a2be46cSDuncan P. N. Exon Smith assert(PCM.Buffer && "Trying to finalize a dropped PCM..."); 790a2be46cSDuncan P. N. Exon Smith PCM.IsFinal = true; 808bef5cd4SDuncan P. N. Exon Smith } 81