1 //===- ModuleManager.cpp - Module Manager ---------------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 // This file defines the ModuleManager class, which manages a set of loaded
10 // modules for the ASTReader.
12 //===----------------------------------------------------------------------===//
14 #include "clang/Serialization/ModuleManager.h"
15 #include "clang/Basic/FileManager.h"
16 #include "clang/Basic/LLVM.h"
17 #include "clang/Lex/HeaderSearch.h"
18 #include "clang/Lex/ModuleMap.h"
19 #include "clang/Serialization/GlobalModuleIndex.h"
20 #include "clang/Serialization/InMemoryModuleCache.h"
21 #include "clang/Serialization/ModuleFile.h"
22 #include "clang/Serialization/PCHContainerOperations.h"
23 #include "llvm/ADT/STLExtras.h"
24 #include "llvm/ADT/SetVector.h"
25 #include "llvm/ADT/SmallPtrSet.h"
26 #include "llvm/ADT/SmallVector.h"
27 #include "llvm/ADT/StringRef.h"
28 #include "llvm/ADT/iterator.h"
29 #include "llvm/Support/Chrono.h"
30 #include "llvm/Support/DOTGraphTraits.h"
31 #include "llvm/Support/ErrorOr.h"
32 #include "llvm/Support/GraphWriter.h"
33 #include "llvm/Support/MemoryBuffer.h"
34 #include "llvm/Support/VirtualFileSystem.h"
39 #include <system_error>
41 using namespace clang
;
42 using namespace serialization
;
44 ModuleFile
*ModuleManager::lookupByFileName(StringRef Name
) const {
45 auto Entry
= FileMgr
.getFile(Name
, /*OpenFile=*/false,
46 /*CacheFailure=*/false);
48 return lookup(*Entry
);
53 ModuleFile
*ModuleManager::lookupByModuleName(StringRef Name
) const {
54 if (const Module
*Mod
= HeaderSearchInfo
.getModuleMap().findModule(Name
))
55 if (const FileEntry
*File
= Mod
->getASTFile())
61 ModuleFile
*ModuleManager::lookup(const FileEntry
*File
) const {
62 return Modules
.lookup(File
);
65 std::unique_ptr
<llvm::MemoryBuffer
>
66 ModuleManager::lookupBuffer(StringRef Name
) {
67 auto Entry
= FileMgr
.getFile(Name
, /*OpenFile=*/false,
68 /*CacheFailure=*/false);
71 return std::move(InMemoryBuffers
[*Entry
]);
74 static bool checkSignature(ASTFileSignature Signature
,
75 ASTFileSignature ExpectedSignature
,
76 std::string
&ErrorStr
) {
77 if (!ExpectedSignature
|| Signature
== ExpectedSignature
)
81 Signature
? "signature mismatch" : "could not read module signature";
85 static void updateModuleImports(ModuleFile
&MF
, ModuleFile
*ImportedBy
,
86 SourceLocation ImportLoc
) {
88 MF
.ImportedBy
.insert(ImportedBy
);
89 ImportedBy
->Imports
.insert(&MF
);
91 if (!MF
.DirectlyImported
)
92 MF
.ImportLoc
= ImportLoc
;
94 MF
.DirectlyImported
= true;
98 ModuleManager::AddModuleResult
99 ModuleManager::addModule(StringRef FileName
, ModuleKind Type
,
100 SourceLocation ImportLoc
, ModuleFile
*ImportedBy
,
102 off_t ExpectedSize
, time_t ExpectedModTime
,
103 ASTFileSignature ExpectedSignature
,
104 ASTFileSignatureReader ReadSignature
,
106 std::string
&ErrorStr
) {
109 // Look for the file entry. This only fails if the expected size or
110 // modification time differ.
111 OptionalFileEntryRefDegradesToFileEntryPtr Entry
;
112 if (Type
== MK_ExplicitModule
|| Type
== MK_PrebuiltModule
) {
113 // If we're not expecting to pull this file out of the module cache, it
114 // might have a different mtime due to being moved across filesystems in
115 // a distributed build. The size must still match, though. (As must the
116 // contents, but we can't check that.)
119 // Note: ExpectedSize and ExpectedModTime will be 0 for MK_ImplicitModule
120 // when using an ASTFileSignature.
121 if (lookupModuleFile(FileName
, ExpectedSize
, ExpectedModTime
, Entry
)) {
122 ErrorStr
= "module file out of date";
126 if (!Entry
&& FileName
!= "-") {
127 ErrorStr
= "module file not found";
131 // The ModuleManager's use of FileEntry nodes as the keys for its map of
132 // loaded modules is less than ideal. Uniqueness for FileEntry nodes is
133 // maintained by FileManager, which in turn uses inode numbers on hosts
134 // that support that. When coupled with the module cache's proclivity for
135 // turning over and deleting stale PCMs, this means entries for different
136 // module files can wind up reusing the same underlying inode. When this
137 // happens, subsequent accesses to the Modules map will disagree on the
138 // ModuleFile associated with a given file. In general, it is not sufficient
139 // to resolve this conundrum with a type like FileEntryRef that stores the
140 // name of the FileEntry node on first access because of path canonicalization
141 // issues. However, the paths constructed for implicit module builds are
142 // fully under Clang's control. We *can*, therefore, rely on their structure
143 // being consistent across operating systems and across subsequent accesses
144 // to the Modules map.
145 auto implicitModuleNamesMatch
= [](ModuleKind Kind
, const ModuleFile
*MF
,
146 const FileEntry
*Entry
) -> bool {
147 if (Kind
!= MK_ImplicitModule
)
149 return Entry
->getName() == MF
->FileName
;
152 // Check whether we already loaded this module, before
153 if (ModuleFile
*ModuleEntry
= Modules
.lookup(Entry
)) {
154 if (implicitModuleNamesMatch(Type
, ModuleEntry
, Entry
)) {
155 // Check the stored signature.
156 if (checkSignature(ModuleEntry
->Signature
, ExpectedSignature
, ErrorStr
))
159 Module
= ModuleEntry
;
160 updateModuleImports(*ModuleEntry
, ImportedBy
, ImportLoc
);
161 return AlreadyLoaded
;
165 // Allocate a new module.
166 auto NewModule
= std::make_unique
<ModuleFile
>(Type
, Generation
);
167 NewModule
->Index
= Chain
.size();
168 NewModule
->FileName
= FileName
.str();
169 NewModule
->File
= Entry
;
170 NewModule
->ImportLoc
= ImportLoc
;
171 NewModule
->InputFilesValidationTimestamp
= 0;
173 if (NewModule
->Kind
== MK_ImplicitModule
) {
174 std::string TimestampFilename
= NewModule
->getTimestampFilename();
175 llvm::vfs::Status Status
;
176 // A cached stat value would be fine as well.
177 if (!FileMgr
.getNoncachedStatValue(TimestampFilename
, Status
))
178 NewModule
->InputFilesValidationTimestamp
=
179 llvm::sys::toTimeT(Status
.getLastModificationTime());
182 // Load the contents of the module
183 if (std::unique_ptr
<llvm::MemoryBuffer
> Buffer
= lookupBuffer(FileName
)) {
184 // The buffer was already provided for us.
185 NewModule
->Buffer
= &ModuleCache
->addBuiltPCM(FileName
, std::move(Buffer
));
186 // Since the cached buffer is reused, it is safe to close the file
187 // descriptor that was opened while stat()ing the PCM in
188 // lookupModuleFile() above, it won't be needed any longer.
190 } else if (llvm::MemoryBuffer
*Buffer
=
191 getModuleCache().lookupPCM(FileName
)) {
192 NewModule
->Buffer
= Buffer
;
193 // As above, the file descriptor is no longer needed.
195 } else if (getModuleCache().shouldBuildPCM(FileName
)) {
196 // Report that the module is out of date, since we tried (and failed) to
197 // import it earlier.
201 // Open the AST file.
202 llvm::ErrorOr
<std::unique_ptr
<llvm::MemoryBuffer
>> Buf((std::error_code()));
203 if (FileName
== "-") {
204 Buf
= llvm::MemoryBuffer::getSTDIN();
206 // Get a buffer of the file and close the file descriptor when done.
207 // The file is volatile because in a parallel build we expect multiple
208 // compiler processes to use the same module file rebuilding it if needed.
210 // RequiresNullTerminator is false because module files don't need it, and
211 // this allows the file to still be mmapped.
212 Buf
= FileMgr
.getBufferForFile(NewModule
->File
,
214 /*RequiresNullTerminator=*/false);
218 ErrorStr
= Buf
.getError().message();
222 NewModule
->Buffer
= &getModuleCache().addPCM(FileName
, std::move(*Buf
));
225 // Initialize the stream.
226 NewModule
->Data
= PCHContainerRdr
.ExtractPCH(*NewModule
->Buffer
);
228 // Read the signature eagerly now so that we can check it. Avoid calling
229 // ReadSignature unless there's something to check though.
230 if (ExpectedSignature
&& checkSignature(ReadSignature(NewModule
->Data
),
231 ExpectedSignature
, ErrorStr
))
234 // We're keeping this module. Store it everywhere.
235 Module
= Modules
[Entry
] = NewModule
.get();
237 updateModuleImports(*NewModule
, ImportedBy
, ImportLoc
);
239 if (!NewModule
->isModule())
240 PCHChain
.push_back(NewModule
.get());
242 Roots
.push_back(NewModule
.get());
244 Chain
.push_back(std::move(NewModule
));
248 void ModuleManager::removeModules(ModuleIterator First
) {
253 // Explicitly clear VisitOrder since we might not notice it is stale.
256 // Collect the set of module file pointers that we'll be removing.
257 llvm::SmallPtrSet
<ModuleFile
*, 4> victimSet(
258 (llvm::pointer_iterator
<ModuleIterator
>(First
)),
259 (llvm::pointer_iterator
<ModuleIterator
>(Last
)));
261 auto IsVictim
= [&](ModuleFile
*MF
) {
262 return victimSet
.count(MF
);
264 // Remove any references to the now-destroyed modules.
265 for (auto I
= begin(); I
!= First
; ++I
) {
266 I
->Imports
.remove_if(IsVictim
);
267 I
->ImportedBy
.remove_if(IsVictim
);
269 llvm::erase_if(Roots
, IsVictim
);
271 // Remove the modules from the PCH chain.
272 for (auto I
= First
; I
!= Last
; ++I
) {
273 if (!I
->isModule()) {
274 PCHChain
.erase(llvm::find(PCHChain
, &*I
), PCHChain
.end());
279 // Delete the modules.
280 for (ModuleIterator victim
= First
; victim
!= Last
; ++victim
)
281 Modules
.erase(victim
->File
);
283 Chain
.erase(Chain
.begin() + (First
- begin()), Chain
.end());
287 ModuleManager::addInMemoryBuffer(StringRef FileName
,
288 std::unique_ptr
<llvm::MemoryBuffer
> Buffer
) {
289 const FileEntry
*Entry
=
290 FileMgr
.getVirtualFile(FileName
, Buffer
->getBufferSize(), 0);
291 InMemoryBuffers
[Entry
] = std::move(Buffer
);
294 std::unique_ptr
<ModuleManager::VisitState
> ModuleManager::allocateVisitState() {
295 // Fast path: if we have a cached state, use it.
296 if (FirstVisitState
) {
297 auto Result
= std::move(FirstVisitState
);
298 FirstVisitState
= std::move(Result
->NextState
);
302 // Allocate and return a new state.
303 return std::make_unique
<VisitState
>(size());
306 void ModuleManager::returnVisitState(std::unique_ptr
<VisitState
> State
) {
307 assert(State
->NextState
== nullptr && "Visited state is in list?");
308 State
->NextState
= std::move(FirstVisitState
);
309 FirstVisitState
= std::move(State
);
312 void ModuleManager::setGlobalIndex(GlobalModuleIndex
*Index
) {
315 ModulesInCommonWithGlobalIndex
.clear();
319 // Notify the global module index about all of the modules we've already
321 for (ModuleFile
&M
: *this)
322 if (!GlobalIndex
->loadedModuleFile(&M
))
323 ModulesInCommonWithGlobalIndex
.push_back(&M
);
326 void ModuleManager::moduleFileAccepted(ModuleFile
*MF
) {
327 if (!GlobalIndex
|| GlobalIndex
->loadedModuleFile(MF
))
330 ModulesInCommonWithGlobalIndex
.push_back(MF
);
333 ModuleManager::ModuleManager(FileManager
&FileMgr
,
334 InMemoryModuleCache
&ModuleCache
,
335 const PCHContainerReader
&PCHContainerRdr
,
336 const HeaderSearch
&HeaderSearchInfo
)
337 : FileMgr(FileMgr
), ModuleCache(&ModuleCache
),
338 PCHContainerRdr(PCHContainerRdr
), HeaderSearchInfo(HeaderSearchInfo
) {}
340 void ModuleManager::visit(llvm::function_ref
<bool(ModuleFile
&M
)> Visitor
,
341 llvm::SmallPtrSetImpl
<ModuleFile
*> *ModuleFilesHit
) {
342 // If the visitation order vector is the wrong size, recompute the order.
343 if (VisitOrder
.size() != Chain
.size()) {
346 VisitOrder
.reserve(N
);
348 // Record the number of incoming edges for each module. When we
349 // encounter a module with no incoming edges, push it into the queue
350 // to seed the queue.
351 SmallVector
<ModuleFile
*, 4> Queue
;
353 llvm::SmallVector
<unsigned, 4> UnusedIncomingEdges
;
354 UnusedIncomingEdges
.resize(size());
355 for (ModuleFile
&M
: llvm::reverse(*this)) {
356 unsigned Size
= M
.ImportedBy
.size();
357 UnusedIncomingEdges
[M
.Index
] = Size
;
362 // Traverse the graph, making sure to visit a module before visiting any
363 // of its dependencies.
364 while (!Queue
.empty()) {
365 ModuleFile
*CurrentModule
= Queue
.pop_back_val();
366 VisitOrder
.push_back(CurrentModule
);
368 // For any module that this module depends on, push it on the
369 // stack (if it hasn't already been marked as visited).
370 for (ModuleFile
*M
: llvm::reverse(CurrentModule
->Imports
)) {
371 // Remove our current module as an impediment to visiting the
372 // module we depend on. If we were the last unvisited module
373 // that depends on this particular module, push it into the
374 // queue to be visited.
375 unsigned &NumUnusedEdges
= UnusedIncomingEdges
[M
->Index
];
376 if (NumUnusedEdges
&& (--NumUnusedEdges
== 0))
381 assert(VisitOrder
.size() == N
&& "Visitation order is wrong?");
383 FirstVisitState
= nullptr;
386 auto State
= allocateVisitState();
387 unsigned VisitNumber
= State
->NextVisitNumber
++;
389 // If the caller has provided us with a hit-set that came from the global
390 // module index, mark every module file in common with the global module
391 // index that is *not* in that set as 'visited'.
392 if (ModuleFilesHit
&& !ModulesInCommonWithGlobalIndex
.empty()) {
393 for (unsigned I
= 0, N
= ModulesInCommonWithGlobalIndex
.size(); I
!= N
; ++I
)
395 ModuleFile
*M
= ModulesInCommonWithGlobalIndex
[I
];
396 if (!ModuleFilesHit
->count(M
))
397 State
->VisitNumber
[M
->Index
] = VisitNumber
;
401 for (unsigned I
= 0, N
= VisitOrder
.size(); I
!= N
; ++I
) {
402 ModuleFile
*CurrentModule
= VisitOrder
[I
];
403 // Should we skip this module file?
404 if (State
->VisitNumber
[CurrentModule
->Index
] == VisitNumber
)
408 assert(State
->VisitNumber
[CurrentModule
->Index
] == VisitNumber
- 1);
409 State
->VisitNumber
[CurrentModule
->Index
] = VisitNumber
;
410 if (!Visitor(*CurrentModule
))
413 // The visitor has requested that cut off visitation of any
414 // module that the current module depends on. To indicate this
415 // behavior, we mark all of the reachable modules as having been visited.
416 ModuleFile
*NextModule
= CurrentModule
;
418 // For any module that this module depends on, push it on the
419 // stack (if it hasn't already been marked as visited).
420 for (llvm::SetVector
<ModuleFile
*>::iterator
421 M
= NextModule
->Imports
.begin(),
422 MEnd
= NextModule
->Imports
.end();
424 if (State
->VisitNumber
[(*M
)->Index
] != VisitNumber
) {
425 State
->Stack
.push_back(*M
);
426 State
->VisitNumber
[(*M
)->Index
] = VisitNumber
;
430 if (State
->Stack
.empty())
433 // Pop the next module off the stack.
434 NextModule
= State
->Stack
.pop_back_val();
438 returnVisitState(std::move(State
));
441 bool ModuleManager::lookupModuleFile(StringRef FileName
, off_t ExpectedSize
,
442 time_t ExpectedModTime
,
443 OptionalFileEntryRef
&File
) {
448 // Open the file immediately to ensure there is no race between stat'ing and
450 OptionalFileEntryRef FileOrErr
=
451 expectedToOptional(FileMgr
.getFileRef(FileName
, /*OpenFile=*/true,
452 /*CacheFailure=*/false));
458 if ((ExpectedSize
&& ExpectedSize
!= File
->getSize()) ||
459 (ExpectedModTime
&& ExpectedModTime
!= File
->getModificationTime()))
460 // Do not destroy File, as it may be referenced. If we need to rebuild it,
461 // it will be destroyed by removeModules.
471 struct GraphTraits
<ModuleManager
> {
472 using NodeRef
= ModuleFile
*;
473 using ChildIteratorType
= llvm::SetVector
<ModuleFile
*>::const_iterator
;
474 using nodes_iterator
= pointer_iterator
<ModuleManager::ModuleConstIterator
>;
476 static ChildIteratorType
child_begin(NodeRef Node
) {
477 return Node
->Imports
.begin();
480 static ChildIteratorType
child_end(NodeRef Node
) {
481 return Node
->Imports
.end();
484 static nodes_iterator
nodes_begin(const ModuleManager
&Manager
) {
485 return nodes_iterator(Manager
.begin());
488 static nodes_iterator
nodes_end(const ModuleManager
&Manager
) {
489 return nodes_iterator(Manager
.end());
494 struct DOTGraphTraits
<ModuleManager
> : public DefaultDOTGraphTraits
{
495 explicit DOTGraphTraits(bool IsSimple
= false)
496 : DefaultDOTGraphTraits(IsSimple
) {}
498 static bool renderGraphFromBottomUp() { return true; }
500 std::string
getNodeLabel(ModuleFile
*M
, const ModuleManager
&) {
501 return M
->ModuleName
;
507 void ModuleManager::viewGraph() {
508 llvm::ViewGraph(*this, "Modules");