55 const clang::LangOptions &Opts = SemaRef.getLangOpts();
56 const clang::Preprocessor &PP = SemaRef.getPreprocessor();
58 llvm::StringRef CachePath = PP.getHeaderSearchInfo().getHeaderSearchOpts().ModuleCachePath;
59 std::string RdictsStart =
"lib" + Opts.CurrentModule +
"_";
60 const std::string RdictsEnd =
"_rdict.pcm";
63 using namespace clang;
64 using namespace clang::serialization;
66 auto Abv = std::make_shared<BitCodeAbbrev>();
67 Abv->Add(BitCodeAbbrevOp(FIRST_EXTENSION_RECORD_ID));
68 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
69 auto Abbrev = Stream.EmitAbbrev(std::move(Abv));
70 auto Abv1 = std::make_shared<BitCodeAbbrev>();
71 Abv1->Add(BitCodeAbbrevOp(FIRST_EXTENSION_RECORD_ID + 1));
72 Abv1->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
73 auto Abbrev1 = Stream.EmitAbbrev(std::move(Abv1));
77 for (llvm::sys::fs::directory_iterator DirIt(CachePath, EC), DirEnd; DirIt != DirEnd && !EC; DirIt.increment(EC)) {
78 StringRef FilePath(DirIt->path());
79 if (llvm::sys::fs::is_directory(FilePath))
81 StringRef FileName = llvm::sys::path::filename(FilePath);
82 if (FileName.starts_with(RdictsStart) && FileName.ends_with(RdictsEnd)) {
84 uint64_t Record[] = {FIRST_EXTENSION_RECORD_ID};
85 Stream.EmitRecordWithBlob(Abbrev, Record, FileName);
87 uint64_t Record1[] = {FIRST_EXTENSION_RECORD_ID + 1};
88 std::ifstream fp(FilePath.str(), std::ios::binary);
89 std::ostringstream os;
91 Stream.EmitRecordWithBlob(Abbrev1, Record1, StringRef(os.str()));
94 EC = llvm::sys::fs::remove(FilePath);
95 assert(!EC &&
"Unable to close _rdict file");
103 clang::serialization::ModuleFile &Mod,
104 const llvm::BitstreamCursor &InStream)
105 : ModuleFileExtensionReader(Ext),
Stream(InStream)
108 llvm::SmallVector<uint64_t, 4> Record;
109 llvm::StringRef CurrentRdictName;
111 llvm::BitstreamEntry Entry = llvm::cantFail(
Stream.advanceSkippingSubblocks());
112 switch (Entry.Kind) {
113 case llvm::BitstreamEntry::SubBlock:
114 case llvm::BitstreamEntry::EndBlock:
115 case llvm::BitstreamEntry::Error:
return;
117 case llvm::BitstreamEntry::Record:
break;
121 llvm::StringRef Blob;
122 unsigned RecCode = llvm::cantFail(
Stream.readRecord(Entry.ID, Record, &Blob));
123 using namespace clang::serialization;
125 case FIRST_EXTENSION_RECORD_ID: {
126 CurrentRdictName = Blob;
129 case FIRST_EXTENSION_RECORD_ID + 1: {
131 std::string ResolvedFileName
133 llvm::StringRef ModDir = llvm::sys::path::parent_path(ResolvedFileName);
134 llvm::SmallString<255> FullRdictName = ModDir;
135 llvm::sys::path::append(FullRdictName, CurrentRdictName);