1//===--- CompilerInstance.cpp ---------------------------------------------===//
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/Frontend/CompilerInstance.h"
10#include "clang/AST/ASTConsumer.h"
11#include "clang/AST/ASTContext.h"
12#include "clang/AST/Decl.h"
13#include "clang/Basic/AtomicLineLogger.h"
14#include "clang/Basic/CharInfo.h"
15#include "clang/Basic/Diagnostic.h"
16#include "clang/Basic/DiagnosticFrontend.h"
17#include "clang/Basic/DiagnosticOptions.h"
18#include "clang/Basic/FileManager.h"
19#include "clang/Basic/LangStandard.h"
20#include "clang/Basic/SourceManager.h"
21#include "clang/Basic/Stack.h"
22#include "clang/Basic/TargetInfo.h"
23#include "clang/Basic/Version.h"
24#include "clang/Config/config.h"
25#include "clang/Frontend/ChainedDiagnosticConsumer.h"
26#include "clang/Frontend/FrontendAction.h"
27#include "clang/Frontend/FrontendActions.h"
28#include "clang/Frontend/FrontendPluginRegistry.h"
29#include "clang/Frontend/LogDiagnosticPrinter.h"
30#include "clang/Frontend/SARIFDiagnosticPrinter.h"
31#include "clang/Frontend/SerializedDiagnosticPrinter.h"
32#include "clang/Frontend/TextDiagnosticPrinter.h"
33#include "clang/Frontend/Utils.h"
34#include "clang/Frontend/VerifyDiagnosticConsumer.h"
35#include "clang/Lex/HeaderSearch.h"
36#include "clang/Lex/Preprocessor.h"
37#include "clang/Lex/PreprocessorOptions.h"
38#include "clang/Lex/TextEncoding.h"
39#include "clang/Sema/CodeCompleteConsumer.h"
40#include "clang/Sema/ParsedAttr.h"
41#include "clang/Sema/Sema.h"
42#include "clang/Serialization/ASTReader.h"
43#include "clang/Serialization/GlobalModuleIndex.h"
44#include "clang/Serialization/InMemoryModuleCache.h"
45#include "clang/Serialization/ModuleCache.h"
46#include "clang/Serialization/ModuleManager.h"
47#include "clang/Serialization/SerializationDiagnostic.h"
48#include "llvm/ADT/IntrusiveRefCntPtr.h"
49#include "llvm/ADT/STLExtras.h"
50#include "llvm/ADT/ScopeExit.h"
51#include "llvm/ADT/Statistic.h"
52#include "llvm/Config/llvm-config.h"
53#include "llvm/Plugins/PassPlugin.h"
54#include "llvm/Support/AdvisoryLock.h"
55#include "llvm/Support/BuryPointer.h"
56#include "llvm/Support/CrashRecoveryContext.h"
57#include "llvm/Support/Errc.h"
58#include "llvm/Support/FileSystem.h"
59#include "llvm/Support/MemoryBuffer.h"
60#include "llvm/Support/Path.h"
61#include "llvm/Support/Signals.h"
62#include "llvm/Support/SmallVectorMemoryBuffer.h"
63#include "llvm/Support/Threading.h"
64#include "llvm/Support/TimeProfiler.h"
65#include "llvm/Support/Timer.h"
66#include "llvm/Support/VirtualFileSystem.h"
67#include "llvm/Support/VirtualOutputBackends.h"
68#include "llvm/Support/VirtualOutputError.h"
69#include "llvm/Support/raw_ostream.h"
70#include "llvm/TargetParser/Host.h"
71#include <optional>
72#include <time.h>
73#include <utility>
74
75using namespace clang;
76
77CompilerInstance::CompilerInstance(
78 std::shared_ptr<CompilerInvocation> Invocation,
79 std::shared_ptr<PCHContainerOperations> PCHContainerOps,
80 std::shared_ptr<ModuleCache> ModCache)
81 : ModuleLoader(/*BuildingModule=*/ModCache != nullptr),
82 Invocation(std::move(Invocation)),
83 ModCache(ModCache ? std::move(ModCache)
84 : createCrossProcessModuleCache()),
85 ThePCHContainerOperations(std::move(PCHContainerOps)) {
86 assert(this->Invocation && "Invocation must not be null");
87}
88
89CompilerInstance::~CompilerInstance() {
90 assert(OutputFiles.empty() && "Still output files in flight?");
91}
92
93bool CompilerInstance::shouldBuildGlobalModuleIndex() const {
94 return (BuildGlobalModuleIndex ||
95 (TheASTReader && TheASTReader->isGlobalIndexUnavailable() &&
96 getFrontendOpts().GenerateGlobalModuleIndex)) &&
97 !DisableGeneratingGlobalModuleIndex;
98}
99
100void CompilerInstance::setDiagnostics(
101 llvm::IntrusiveRefCntPtr<DiagnosticsEngine> Value) {
102 Diagnostics = std::move(Value);
103}
104
105void CompilerInstance::setVerboseOutputStream(raw_ostream &Value) {
106 OwnedVerboseOutputStream.reset();
107 VerboseOutputStream = &Value;
108}
109
110void CompilerInstance::setVerboseOutputStream(std::unique_ptr<raw_ostream> Value) {
111 OwnedVerboseOutputStream.swap(u&: Value);
112 VerboseOutputStream = OwnedVerboseOutputStream.get();
113}
114
115void CompilerInstance::setTarget(TargetInfo *Value) { Target = Value; }
116void CompilerInstance::setAuxTarget(TargetInfo *Value) { AuxTarget = Value; }
117
118bool CompilerInstance::createTarget() {
119 // Create the target instance.
120 setTarget(TargetInfo::CreateTargetInfo(Diags&: getDiagnostics(),
121 Opts&: getInvocation().getTargetOpts()));
122 if (!hasTarget())
123 return false;
124
125 if (getLangOpts().SYCLIsDevice && !getTarget().getTriple().isGPU()) {
126 getDiagnostics().Report(DiagID: diag::err_sycl_device_invalid_target)
127 << getTarget().getTriple().str();
128 return false;
129 }
130
131 // Check whether AuxTarget exists, if not, then create TargetInfo for the
132 // other side of CUDA/OpenMP/SYCL compilation.
133 if (!getAuxTarget() &&
134 (getLangOpts().CUDA || getLangOpts().isTargetDevice()) &&
135 !getFrontendOpts().AuxTriple.empty()) {
136 auto &TO = AuxTargetOpts = std::make_unique<TargetOptions>();
137 TO->Triple = llvm::Triple::normalize(Str: getFrontendOpts().AuxTriple);
138 if (getFrontendOpts().AuxTargetCPU)
139 TO->CPU = *getFrontendOpts().AuxTargetCPU;
140 if (getFrontendOpts().AuxTargetFeatures)
141 TO->FeaturesAsWritten = *getFrontendOpts().AuxTargetFeatures;
142 TO->HostTriple = getTarget().getTriple().str();
143 setAuxTarget(TargetInfo::CreateTargetInfo(Diags&: getDiagnostics(), Opts&: *TO));
144 }
145
146 if (!getTarget().hasStrictFP() && !getLangOpts().ExpStrictFP) {
147 if (getLangOpts().RoundingMath) {
148 getDiagnostics().Report(DiagID: diag::warn_fe_backend_unsupported_fp_rounding);
149 getLangOpts().RoundingMath = false;
150 }
151 auto FPExc = getLangOpts().getFPExceptionMode();
152 if (FPExc != LangOptions::FPE_Default && FPExc != LangOptions::FPE_Ignore) {
153 getDiagnostics().Report(DiagID: diag::warn_fe_backend_unsupported_fp_exceptions);
154 getLangOpts().setFPExceptionMode(LangOptions::FPE_Ignore);
155 }
156 // FIXME: can we disable FEnvAccess?
157 }
158
159 // We should do it here because target knows nothing about
160 // language options when it's being created.
161 if (getLangOpts().OpenCL &&
162 !getTarget().validateOpenCLTarget(Opts: getLangOpts(), Diags&: getDiagnostics()))
163 return false;
164
165 // Inform the target of the language options.
166 // FIXME: We shouldn't need to do this, the target should be immutable once
167 // created. This complexity should be lifted elsewhere.
168 getTarget().adjust(Diags&: getDiagnostics(), Opts&: getLangOpts(), Aux: getAuxTarget());
169
170 if (auto *Aux = getAuxTarget())
171 getTarget().setAuxTarget(Aux);
172
173 return true;
174}
175
176void CompilerInstance::setFileManager(IntrusiveRefCntPtr<FileManager> Value) {
177 assert(Value == nullptr ||
178 getVirtualFileSystemPtr() == Value->getVirtualFileSystemPtr());
179 FileMgr = std::move(Value);
180}
181
182void CompilerInstance::setSourceManager(
183 llvm::IntrusiveRefCntPtr<SourceManager> Value) {
184 SourceMgr = std::move(Value);
185}
186
187void CompilerInstance::setPreprocessor(std::shared_ptr<Preprocessor> Value) {
188 PP = std::move(Value);
189}
190
191IntrusiveRefCntPtr<ASTContext> CompilerInstance::getASTContextPtr() const {
192 assert(Context && "Compiler instance has no AST context!");
193 return Context;
194}
195
196void CompilerInstance::setASTContext(
197 llvm::IntrusiveRefCntPtr<ASTContext> Value) {
198 Context = std::move(Value);
199
200 if (Context && Consumer)
201 getASTConsumer().Initialize(Context&: getASTContext());
202}
203
204void CompilerInstance::setSema(Sema *S) {
205 TheSema.reset(p: S);
206}
207
208void CompilerInstance::setASTConsumer(std::unique_ptr<ASTConsumer> Value) {
209 Consumer = std::move(Value);
210
211 if (Context && Consumer)
212 getASTConsumer().Initialize(Context&: getASTContext());
213}
214
215void CompilerInstance::setCodeCompletionConsumer(CodeCompleteConsumer *Value) {
216 CompletionConsumer.reset(p: Value);
217}
218
219std::unique_ptr<Sema> CompilerInstance::takeSema() {
220 return std::move(TheSema);
221}
222
223IntrusiveRefCntPtr<ASTReader> CompilerInstance::getASTReader() const {
224 return TheASTReader;
225}
226void CompilerInstance::setASTReader(IntrusiveRefCntPtr<ASTReader> Reader) {
227 assert(ModCache.get() == &Reader->getModuleManager().getModuleCache() &&
228 "Expected ASTReader to use the same PCM cache");
229 TheASTReader = std::move(Reader);
230}
231
232std::shared_ptr<ModuleDependencyCollector>
233CompilerInstance::getModuleDepCollector() const {
234 return ModuleDepCollector;
235}
236
237void CompilerInstance::setModuleDepCollector(
238 std::shared_ptr<ModuleDependencyCollector> Collector) {
239 ModuleDepCollector = std::move(Collector);
240}
241
242static void collectHeaderMaps(const HeaderSearch &HS,
243 std::shared_ptr<ModuleDependencyCollector> MDC) {
244 SmallVector<std::string, 4> HeaderMapFileNames;
245 HS.getHeaderMapFileNames(Names&: HeaderMapFileNames);
246 for (auto &Name : HeaderMapFileNames)
247 MDC->addFile(Filename: Name);
248}
249
250static void collectIncludePCH(CompilerInstance &CI,
251 std::shared_ptr<ModuleDependencyCollector> MDC) {
252 const PreprocessorOptions &PPOpts = CI.getPreprocessorOpts();
253 if (PPOpts.ImplicitPCHInclude.empty())
254 return;
255
256 StringRef PCHInclude = PPOpts.ImplicitPCHInclude;
257 FileManager &FileMgr = CI.getFileManager();
258 auto PCHDir = FileMgr.getOptionalDirectoryRef(DirName: PCHInclude);
259 if (!PCHDir) {
260 MDC->addFile(Filename: PCHInclude);
261 return;
262 }
263
264 std::error_code EC;
265 SmallString<128> DirNative;
266 llvm::sys::path::native(path: PCHDir->getName(), result&: DirNative);
267 llvm::vfs::FileSystem &FS = FileMgr.getVirtualFileSystem();
268 SimpleASTReaderListener Validator(CI.getPreprocessor());
269 for (llvm::vfs::directory_iterator Dir = FS.dir_begin(Dir: DirNative, EC), DirEnd;
270 Dir != DirEnd && !EC; Dir.increment(EC)) {
271 // Check whether this is an AST file. ASTReader::isAcceptableASTFile is not
272 // used here since we're not interested in validating the PCH at this time,
273 // but only to check whether this is a file containing an AST.
274 if (!ASTReader::readASTFileControlBlock(
275 Filename: Dir->path(), FileMgr, ModCache: CI.getModuleCache(),
276 PCHContainerRdr: CI.getPCHContainerReader(),
277 /*FindModuleFileExtensions=*/false, Listener&: Validator,
278 /*ValidateDiagnosticOptions=*/false))
279 MDC->addFile(Filename: Dir->path());
280 }
281}
282
283static void collectVFSEntries(CompilerInstance &CI,
284 std::shared_ptr<ModuleDependencyCollector> MDC) {
285 // Collect all VFS found.
286 SmallVector<llvm::vfs::YAMLVFSEntry, 16> VFSEntries;
287 CI.getVirtualFileSystem().visit(Callback: [&](llvm::vfs::FileSystem &VFS) {
288 if (auto *RedirectingVFS = dyn_cast<llvm::vfs::RedirectingFileSystem>(Val: &VFS))
289 llvm::vfs::collectVFSEntries(VFS&: *RedirectingVFS, CollectedEntries&: VFSEntries);
290 });
291
292 for (auto &E : VFSEntries)
293 MDC->addFile(Filename: E.VPath, FileDst: E.RPath);
294}
295
296void CompilerInstance::createVirtualFileSystem(
297 IntrusiveRefCntPtr<llvm::vfs::FileSystem> BaseFS, DiagnosticConsumer *DC) {
298 bool ShouldOwnClient = false;
299 if (!DC) {
300 DC = new DiagnosticConsumer;
301 ShouldOwnClient = true;
302 }
303
304 DiagnosticOptions DiagOpts;
305 DiagnosticsEngine Diags(DiagnosticIDs::create(), DiagOpts, DC,
306 ShouldOwnClient);
307
308 VFS = createVFSFromCompilerInvocation(CI: getInvocation(), Diags,
309 BaseFS: std::move(BaseFS));
310 // FIXME: Should this go into createVFSFromCompilerInvocation?
311 if (getFrontendOpts().ShowStats)
312 VFS =
313 llvm::makeIntrusiveRefCnt<llvm::vfs::TracingFileSystem>(A: std::move(VFS));
314}
315
316// Diagnostics
317static void SetUpDiagnosticLog(DiagnosticOptions &DiagOpts,
318 const CodeGenOptions *CodeGenOpts,
319 DiagnosticsEngine &Diags) {
320 std::error_code EC;
321 std::unique_ptr<raw_ostream> StreamOwner;
322 raw_ostream *OS = &llvm::errs();
323 if (DiagOpts.DiagnosticLogFile != "-") {
324 // Create the output stream.
325 auto FileOS = std::make_unique<llvm::raw_fd_ostream>(
326 args&: DiagOpts.DiagnosticLogFile, args&: EC,
327 args: llvm::sys::fs::OF_Append | llvm::sys::fs::OF_TextWithCRLF);
328 if (EC) {
329 Diags.Report(DiagID: diag::warn_fe_cc_log_diagnostics_failure)
330 << DiagOpts.DiagnosticLogFile << EC.message();
331 } else {
332 FileOS->SetUnbuffered();
333 OS = FileOS.get();
334 StreamOwner = std::move(FileOS);
335 }
336 }
337
338 // Chain in the diagnostic client which will log the diagnostics.
339 auto Logger = std::make_unique<LogDiagnosticPrinter>(args&: *OS, args&: DiagOpts,
340 args: std::move(StreamOwner));
341 if (CodeGenOpts)
342 Logger->setDwarfDebugFlags(CodeGenOpts->DwarfDebugFlags);
343 if (Diags.ownsClient()) {
344 Diags.setClient(
345 client: new ChainedDiagnosticConsumer(Diags.takeClient(), std::move(Logger)));
346 } else {
347 Diags.setClient(
348 client: new ChainedDiagnosticConsumer(Diags.getClient(), std::move(Logger)));
349 }
350}
351
352static void SetupSerializedDiagnostics(DiagnosticOptions &DiagOpts,
353 DiagnosticsEngine &Diags,
354 StringRef OutputFile) {
355 auto SerializedConsumer =
356 clang::serialized_diags::create(OutputFile, DiagOpts);
357
358 if (Diags.ownsClient()) {
359 Diags.setClient(client: new ChainedDiagnosticConsumer(
360 Diags.takeClient(), std::move(SerializedConsumer)));
361 } else {
362 Diags.setClient(client: new ChainedDiagnosticConsumer(
363 Diags.getClient(), std::move(SerializedConsumer)));
364 }
365}
366
367void CompilerInstance::createDiagnostics(DiagnosticConsumer *Client,
368 bool ShouldOwnClient) {
369 Diagnostics = createDiagnostics(VFS&: getVirtualFileSystem(), Opts&: getDiagnosticOpts(),
370 Client, ShouldOwnClient, CodeGenOpts: &getCodeGenOpts());
371}
372
373IntrusiveRefCntPtr<DiagnosticsEngine> CompilerInstance::createDiagnostics(
374 llvm::vfs::FileSystem &VFS, DiagnosticOptions &Opts,
375 DiagnosticConsumer *Client, bool ShouldOwnClient,
376 const CodeGenOptions *CodeGenOpts) {
377 auto Diags = llvm::makeIntrusiveRefCnt<DiagnosticsEngine>(
378 A: DiagnosticIDs::create(), A&: Opts);
379
380 // Create the diagnostic client for reporting errors or for
381 // implementing -verify.
382 if (Client) {
383 Diags->setClient(client: Client, ShouldOwnClient);
384 } else if (Opts.getFormat() == DiagnosticOptions::SARIF) {
385 Diags->setClient(client: new SARIFDiagnosticPrinter(llvm::errs(), Opts));
386 } else
387 Diags->setClient(client: new TextDiagnosticPrinter(llvm::errs(), Opts));
388
389 // Chain in -verify checker, if requested.
390 if (Opts.VerifyDiagnostics)
391 Diags->setClient(client: new VerifyDiagnosticConsumer(*Diags));
392
393 // Chain in -diagnostic-log-file dumper, if requested.
394 if (!Opts.DiagnosticLogFile.empty())
395 SetUpDiagnosticLog(DiagOpts&: Opts, CodeGenOpts, Diags&: *Diags);
396
397 if (!Opts.DiagnosticSerializationFile.empty())
398 SetupSerializedDiagnostics(DiagOpts&: Opts, Diags&: *Diags, OutputFile: Opts.DiagnosticSerializationFile);
399
400 // Configure our handling of diagnostics.
401 ProcessWarningOptions(Diags&: *Diags, Opts, VFS);
402
403 return Diags;
404}
405
406// File Manager
407
408void CompilerInstance::createFileManager() {
409 assert(VFS && "CompilerInstance needs a VFS for creating FileManager");
410 FileMgr = llvm::makeIntrusiveRefCnt<FileManager>(A&: getFileSystemOpts(), A&: VFS);
411}
412
413// Source Manager
414
415void CompilerInstance::createSourceManager() {
416 assert(Diagnostics && "DiagnosticsEngine needed for creating SourceManager");
417 assert(FileMgr && "FileManager needed for creating SourceManager");
418 SourceMgr = llvm::makeIntrusiveRefCnt<SourceManager>(A&: getDiagnostics(),
419 A&: getFileManager());
420}
421
422// Initialize the remapping of files to alternative contents, e.g.,
423// those specified through other files.
424static void InitializeFileRemapping(DiagnosticsEngine &Diags,
425 SourceManager &SourceMgr,
426 FileManager &FileMgr,
427 const PreprocessorOptions &InitOpts) {
428 // Remap files in the source manager (with buffers).
429 for (const auto &RB : InitOpts.RemappedFileBuffers) {
430 // Create the file entry for the file that we're mapping from.
431 FileEntryRef FromFile =
432 FileMgr.getVirtualFileRef(Filename: RB.first, Size: RB.second->getBufferSize(), ModificationTime: 0);
433
434 // Override the contents of the "from" file with the contents of the
435 // "to" file. If the caller owns the buffers, then pass a MemoryBufferRef;
436 // otherwise, pass as a std::unique_ptr<MemoryBuffer> to transfer ownership
437 // to the SourceManager.
438 if (InitOpts.RetainRemappedFileBuffers)
439 SourceMgr.overrideFileContents(SourceFile: FromFile, Buffer: RB.second->getMemBufferRef());
440 else
441 SourceMgr.overrideFileContents(
442 SourceFile: FromFile, Buffer: std::unique_ptr<llvm::MemoryBuffer>(RB.second));
443 }
444
445 // Remap files in the source manager (with other files).
446 for (const auto &RF : InitOpts.RemappedFiles) {
447 // Find the file that we're mapping to.
448 OptionalFileEntryRef ToFile = FileMgr.getOptionalFileRef(Filename: RF.second);
449 if (!ToFile) {
450 Diags.Report(DiagID: diag::err_fe_remap_missing_to_file) << RF.first << RF.second;
451 continue;
452 }
453
454 // Create the file entry for the file that we're mapping from.
455 FileEntryRef FromFile =
456 FileMgr.getVirtualFileRef(Filename: RF.first, Size: ToFile->getSize(), ModificationTime: 0);
457
458 // Override the contents of the "from" file with the contents of
459 // the "to" file.
460 SourceMgr.overrideFileContents(SourceFile: FromFile, NewFile: *ToFile);
461 }
462
463 SourceMgr.setOverridenFilesKeepOriginalName(
464 InitOpts.RemappedFilesKeepOriginalName);
465}
466
467// Preprocessor
468
469void CompilerInstance::createPreprocessor(TranslationUnitKind TUKind) {
470 const PreprocessorOptions &PPOpts = getPreprocessorOpts();
471
472 // The AST reader holds a reference to the old preprocessor (if any).
473 TheASTReader.reset();
474
475 // Create the Preprocessor.
476 HeaderSearch *HeaderInfo =
477 new HeaderSearch(getHeaderSearchOpts(), getSourceManager(),
478 getDiagnostics(), getLangOpts(), &getTarget());
479 PP = std::make_shared<Preprocessor>(args&: Invocation->getPreprocessorOpts(),
480 args&: getDiagnostics(), args&: getLangOpts(),
481 args&: getSourceManager(), args&: *HeaderInfo, args&: *this,
482 /*IdentifierInfoLookup=*/args: nullptr,
483 /*OwnsHeaderSearch=*/args: true, args&: TUKind);
484 getTarget().adjust(Diags&: getDiagnostics(), Opts&: getLangOpts(), Aux: getAuxTarget());
485 PP->Initialize(Target: getTarget(), AuxTarget: getAuxTarget());
486
487 if (PPOpts.DetailedRecord)
488 PP->createPreprocessingRecord();
489
490 // Apply remappings to the source manager.
491 InitializeFileRemapping(Diags&: PP->getDiagnostics(), SourceMgr&: PP->getSourceManager(),
492 FileMgr&: PP->getFileManager(), InitOpts: PPOpts);
493
494 // Predefine macros and configure the preprocessor.
495 InitializePreprocessor(PP&: *PP, PPOpts, PCHContainerRdr: getPCHContainerReader(),
496 FEOpts: getFrontendOpts(), CodeGenOpts: getCodeGenOpts());
497
498 // Initialize the header search object. In CUDA compilations, we use the aux
499 // triple (the host triple) to initialize our header search, since we need to
500 // find the host headers in order to compile the CUDA code.
501 const llvm::Triple *HeaderSearchTriple = &PP->getTargetInfo().getTriple();
502 if (PP->getTargetInfo().getTriple().getOS() == llvm::Triple::CUDA &&
503 PP->getAuxTargetInfo())
504 HeaderSearchTriple = &PP->getAuxTargetInfo()->getTriple();
505
506 ApplyHeaderSearchOptions(HS&: PP->getHeaderSearchInfo(), HSOpts: getHeaderSearchOpts(),
507 Lang: PP->getLangOpts(), triple: *HeaderSearchTriple);
508
509 PP->setPreprocessedOutput(getPreprocessorOutputOpts().ShowCPP);
510
511 if (PP->getLangOpts().Modules && PP->getLangOpts().ImplicitModules) {
512 // FIXME: We already might've computed the context hash and the specific
513 // module cache path in `FrontendAction::BeginSourceFile()` when turning
514 // "-include-pch <DIR>" into "-include-pch <DIR>/<FILE>". Reuse those here.
515 PP->getHeaderSearchInfo().initializeModuleCachePath(
516 ContextHash: getInvocation().computeContextHash());
517 }
518
519 // Handle generating dependencies, if requested.
520 const DependencyOutputOptions &DepOpts = getDependencyOutputOpts();
521 if (!DepOpts.OutputFile.empty())
522 addDependencyCollector(Listener: std::make_shared<DependencyFileGenerator>(args: DepOpts));
523 if (!DepOpts.DOTOutputFile.empty())
524 AttachDependencyGraphGen(PP&: *PP, OutputFile: DepOpts.DOTOutputFile,
525 SysRoot: getHeaderSearchOpts().Sysroot);
526
527 // If we don't have a collector, but we are collecting module dependencies,
528 // then we're the top level compiler instance and need to create one.
529 if (!ModuleDepCollector && !DepOpts.ModuleDependencyOutputDir.empty()) {
530 ModuleDepCollector = std::make_shared<ModuleDependencyCollector>(
531 args: DepOpts.ModuleDependencyOutputDir, args: getVirtualFileSystemPtr());
532 }
533
534 // If there is a module dep collector, register with other dep collectors
535 // and also (a) collect header maps and (b) TODO: input vfs overlay files.
536 if (ModuleDepCollector) {
537 addDependencyCollector(Listener: ModuleDepCollector);
538 collectHeaderMaps(HS: PP->getHeaderSearchInfo(), MDC: ModuleDepCollector);
539 collectIncludePCH(CI&: *this, MDC: ModuleDepCollector);
540 collectVFSEntries(CI&: *this, MDC: ModuleDepCollector);
541 }
542
543 // Modules need an output manager.
544 if (!hasOutputManager())
545 createOutputManager();
546
547 for (auto &Listener : DependencyCollectors)
548 Listener->attachToPreprocessor(PP&: *PP);
549
550 // Handle generating header include information, if requested.
551 if (DepOpts.ShowHeaderIncludes)
552 AttachHeaderIncludeGen(PP&: *PP, DepOpts);
553 if (!DepOpts.HeaderIncludeOutputFile.empty()) {
554 StringRef OutputPath = DepOpts.HeaderIncludeOutputFile;
555 if (OutputPath == "-")
556 OutputPath = "";
557 AttachHeaderIncludeGen(PP&: *PP, DepOpts,
558 /*ShowAllHeaders=*/true, OutputPath,
559 /*ShowDepth=*/false);
560 }
561
562 if (DepOpts.ShowIncludesDest != ShowIncludesDestination::None) {
563 AttachHeaderIncludeGen(PP&: *PP, DepOpts,
564 /*ShowAllHeaders=*/true, /*OutputPath=*/"",
565 /*ShowDepth=*/true, /*MSStyle=*/true);
566 }
567
568 if (GetDependencyDirectives)
569 PP->setDependencyDirectivesGetter(*GetDependencyDirectives);
570
571 if (auto EC = TextEncoding::setConvertersFromOptions(TE&: PP->getTextEncoding(),
572 Opts: getLangOpts()))
573 PP->getDiagnostics().Report(DiagID: clang::diag::err_fe_text_encoding_config)
574 << PP->getTextEncoding().getLiteralEncoding();
575}
576
577// ASTContext
578
579void CompilerInstance::createASTContext() {
580 Preprocessor &PP = getPreprocessor();
581 auto Context = llvm::makeIntrusiveRefCnt<ASTContext>(
582 A&: getLangOpts(), A&: PP.getSourceManager(), A&: PP.getIdentifierTable(),
583 A&: PP.getSelectorTable(), A&: PP.getBuiltinInfo(), A: PP.TUKind);
584 Context->InitBuiltinTypes(Target: getTarget(), AuxTarget: getAuxTarget());
585 setASTContext(std::move(Context));
586}
587
588// ExternalASTSource
589
590namespace {
591// Helper to recursively read the module names for all modules we're adding.
592// We mark these as known and redirect any attempt to load that module to
593// the files we were handed.
594struct ReadModuleNames : ASTReaderListener {
595 Preprocessor &PP;
596 llvm::SmallVector<std::string, 8> LoadedModules;
597
598 ReadModuleNames(Preprocessor &PP) : PP(PP) {}
599
600 void ReadModuleName(StringRef ModuleName) override {
601 // Keep the module name as a string for now. It's not safe to create a new
602 // IdentifierInfo from an ASTReader callback.
603 LoadedModules.push_back(Elt: ModuleName.str());
604 }
605
606 void registerAll() {
607 ModuleMap &MM = PP.getHeaderSearchInfo().getModuleMap();
608 for (const std::string &LoadedModule : LoadedModules)
609 MM.cacheModuleLoad(II: *PP.getIdentifierInfo(Name: LoadedModule),
610 M: MM.findOrLoadModule(Name: LoadedModule));
611 LoadedModules.clear();
612 }
613
614 void markAllUnavailable() {
615 for (const std::string &LoadedModule : LoadedModules) {
616 if (Module *M = PP.getHeaderSearchInfo().getModuleMap().findOrLoadModule(
617 Name: LoadedModule)) {
618 M->HasIncompatibleModuleFile = true;
619
620 // Mark module as available if the only reason it was unavailable
621 // was missing headers.
622 SmallVector<Module *, 2> Stack;
623 Stack.push_back(Elt: M);
624 while (!Stack.empty()) {
625 Module *Current = Stack.pop_back_val();
626 if (Current->IsUnimportable) continue;
627 Current->IsAvailable = true;
628 auto SubmodulesRange = Current->submodules();
629 llvm::append_range(C&: Stack, R&: SubmodulesRange);
630 }
631 }
632 }
633 LoadedModules.clear();
634 }
635};
636} // namespace
637
638void CompilerInstance::createPCHExternalASTSource(
639 StringRef Path, DisableValidationForModuleKind DisableValidation,
640 bool AllowPCHWithCompilerErrors, void *DeserializationListener,
641 bool OwnDeserializationListener) {
642 bool Preamble = getPreprocessorOpts().PrecompiledPreambleBytes.first != 0;
643 TheASTReader = createPCHExternalASTSource(
644 Path, Sysroot: getHeaderSearchOpts().Sysroot, DisableValidation,
645 AllowPCHWithCompilerErrors, PP&: getPreprocessor(), ModCache&: getModuleCache(),
646 Context&: getASTContext(), PCHContainerRdr: getPCHContainerReader(), CodeGenOpts: getCodeGenOpts(),
647 Extensions: getFrontendOpts().ModuleFileExtensions, DependencyCollectors,
648 DeserializationListener, OwnDeserializationListener, Preamble,
649 UseGlobalModuleIndex: getFrontendOpts().UseGlobalModuleIndex);
650}
651
652IntrusiveRefCntPtr<ASTReader> CompilerInstance::createPCHExternalASTSource(
653 StringRef Path, StringRef Sysroot,
654 DisableValidationForModuleKind DisableValidation,
655 bool AllowPCHWithCompilerErrors, Preprocessor &PP, ModuleCache &ModCache,
656 ASTContext &Context, const PCHContainerReader &PCHContainerRdr,
657 const CodeGenOptions &CodeGenOpts,
658 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
659 ArrayRef<std::shared_ptr<DependencyCollector>> DependencyCollectors,
660 void *DeserializationListener, bool OwnDeserializationListener,
661 bool Preamble, bool UseGlobalModuleIndex) {
662 const HeaderSearchOptions &HSOpts =
663 PP.getHeaderSearchInfo().getHeaderSearchOpts();
664
665 auto Reader = llvm::makeIntrusiveRefCnt<ASTReader>(
666 A&: PP, A&: ModCache, A: &Context, A: PCHContainerRdr, A: CodeGenOpts, A&: Extensions,
667 A: Sysroot.empty() ? "" : Sysroot.data(), A&: DisableValidation,
668 A&: AllowPCHWithCompilerErrors, /*AllowConfigurationMismatch*/ A: false,
669 A: HSOpts.ModulesValidateSystemHeaders,
670 A: HSOpts.ModulesForceValidateUserHeaders,
671 A: HSOpts.ValidateASTInputFilesContent, A&: UseGlobalModuleIndex);
672
673 // We need the external source to be set up before we read the AST, because
674 // eagerly-deserialized declarations may use it.
675 Context.setExternalSource(Reader);
676
677 Reader->setDeserializationListener(
678 Listener: static_cast<ASTDeserializationListener *>(DeserializationListener),
679 /*TakeOwnership=*/OwnDeserializationListener);
680
681 for (auto &Listener : DependencyCollectors)
682 Listener->attachToASTReader(R&: *Reader);
683
684 auto Listener = std::make_unique<ReadModuleNames>(args&: PP);
685 auto &ListenerRef = *Listener;
686 ASTReader::ListenerScope ReadModuleNamesListener(*Reader,
687 std::move(Listener));
688
689 switch (Reader->ReadAST(FileName: ModuleFileName::makeExplicit(Name: Path),
690 Type: Preamble ? serialization::MK_Preamble
691 : serialization::MK_PCH,
692 ImportLoc: SourceLocation(), ClientLoadCapabilities: ASTReader::ARR_None)) {
693 case ASTReader::Success:
694 // Set the predefines buffer as suggested by the PCH reader. Typically, the
695 // predefines buffer will be empty.
696 PP.setPredefines(Reader->getSuggestedPredefines());
697 ListenerRef.registerAll();
698 return Reader;
699
700 case ASTReader::Failure:
701 // Unrecoverable failure: don't even try to process the input file.
702 break;
703
704 case ASTReader::Missing:
705 case ASTReader::OutOfDate:
706 case ASTReader::VersionMismatch:
707 case ASTReader::ConfigurationMismatch:
708 case ASTReader::HadErrors:
709 // No suitable PCH file could be found. Return an error.
710 break;
711 }
712
713 ListenerRef.markAllUnavailable();
714 Context.setExternalSource(nullptr);
715 return nullptr;
716}
717
718// Code Completion
719
720static bool EnableCodeCompletion(Preprocessor &PP,
721 StringRef Filename,
722 unsigned Line,
723 unsigned Column) {
724 // Tell the source manager to chop off the given file at a specific
725 // line and column.
726 auto Entry = PP.getFileManager().getOptionalFileRef(Filename);
727 if (!Entry) {
728 PP.getDiagnostics().Report(DiagID: diag::err_fe_invalid_code_complete_file)
729 << Filename;
730 return true;
731 }
732
733 // Truncate the named file at the given line/column.
734 PP.SetCodeCompletionPoint(File: *Entry, Line, Column);
735 return false;
736}
737
738void CompilerInstance::createCodeCompletionConsumer() {
739 const ParsedSourceLocation &Loc = getFrontendOpts().CodeCompletionAt;
740 if (!CompletionConsumer) {
741 setCodeCompletionConsumer(createCodeCompletionConsumer(
742 PP&: getPreprocessor(), Filename: Loc.FileName, Line: Loc.Line, Column: Loc.Column,
743 Opts: getFrontendOpts().CodeCompleteOpts, OS&: llvm::outs()));
744 return;
745 } else if (EnableCodeCompletion(PP&: getPreprocessor(), Filename: Loc.FileName,
746 Line: Loc.Line, Column: Loc.Column)) {
747 setCodeCompletionConsumer(nullptr);
748 return;
749 }
750}
751
752void CompilerInstance::createFrontendTimer() {
753 timerGroup.reset(p: new llvm::TimerGroup("clang", "Clang time report"));
754 FrontendTimer.reset(p: new llvm::Timer("frontend", "Front end", *timerGroup));
755}
756
757CodeCompleteConsumer *
758CompilerInstance::createCodeCompletionConsumer(Preprocessor &PP,
759 StringRef Filename,
760 unsigned Line,
761 unsigned Column,
762 const CodeCompleteOptions &Opts,
763 raw_ostream &OS) {
764 if (EnableCodeCompletion(PP, Filename, Line, Column))
765 return nullptr;
766
767 // Set up the creation routine for code-completion.
768 return new PrintingCodeCompleteConsumer(Opts, OS);
769}
770
771void CompilerInstance::createSema(TranslationUnitKind TUKind,
772 CodeCompleteConsumer *CompletionConsumer) {
773 TheSema.reset(p: new Sema(getPreprocessor(), getASTContext(), getASTConsumer(),
774 TUKind, CompletionConsumer));
775
776 // Set up API notes.
777 TheSema->APINotes.setSwiftVersion(getAPINotesOpts().SwiftVersion);
778
779 // Attach the external sema source if there is any.
780 if (ExternalSemaSrc) {
781 TheSema->addExternalSource(E: ExternalSemaSrc);
782 ExternalSemaSrc->InitializeSema(S&: *TheSema);
783 }
784
785 // If we're building a module and are supposed to load API notes,
786 // notify the API notes manager.
787 if (auto *currentModule = getPreprocessor().getCurrentModule()) {
788 (void)TheSema->APINotes.loadCurrentModuleAPINotes(
789 M: currentModule, LookInModule: getLangOpts().APINotesModules,
790 SearchPaths: getAPINotesOpts().ModuleSearchPaths);
791 }
792}
793
794// Output Files
795
796void CompilerInstance::clearOutputFiles(bool EraseFiles) {
797 // The ASTConsumer can own streams that write to the output files.
798 assert(!hasASTConsumer() && "ASTConsumer should be reset");
799 if (!EraseFiles) {
800 for (auto &O : OutputFiles)
801 llvm::handleAllErrors(
802 E: O.keep(),
803 Handlers: [&](const llvm::vfs::TempFileOutputError &E) {
804 getDiagnostics().Report(DiagID: diag::err_unable_to_rename_temp)
805 << E.getTempPath() << E.getOutputPath()
806 << E.convertToErrorCode().message();
807 },
808 Handlers: [&](const llvm::vfs::OutputError &E) {
809 getDiagnostics().Report(DiagID: diag::err_fe_unable_to_open_output)
810 << E.getOutputPath() << E.convertToErrorCode().message();
811 },
812 Handlers: [&](const llvm::ErrorInfoBase &EIB) { // Handle any remaining error
813 getDiagnostics().Report(DiagID: diag::err_fe_unable_to_open_output)
814 << O.getPath() << EIB.message();
815 });
816 }
817 OutputFiles.clear();
818 if (DeleteBuiltModules) {
819 for (auto &Module : BuiltModules)
820 llvm::sys::fs::remove(path: Module.second);
821 BuiltModules.clear();
822 }
823}
824
825std::unique_ptr<raw_pwrite_stream> CompilerInstance::createDefaultOutputFile(
826 bool Binary, StringRef InFile, StringRef Extension, bool RemoveFileOnSignal,
827 bool CreateMissingDirectories, bool ForceUseTemporary,
828 bool SetOnlyIfDifferent) {
829 StringRef OutputPath = getFrontendOpts().OutputFile;
830 std::optional<SmallString<128>> PathStorage;
831 if (OutputPath.empty()) {
832 if (InFile == "-" || Extension.empty()) {
833 OutputPath = "-";
834 } else {
835 PathStorage.emplace(args&: InFile);
836 llvm::sys::path::replace_extension(path&: *PathStorage, extension: Extension);
837 OutputPath = *PathStorage;
838 }
839 }
840
841 return createOutputFile(OutputPath, Binary, RemoveFileOnSignal,
842 UseTemporary: getFrontendOpts().UseTemporary || ForceUseTemporary,
843 CreateMissingDirectories, SetOnlyIfDifferent);
844}
845
846std::unique_ptr<raw_pwrite_stream> CompilerInstance::createNullOutputFile() {
847 return std::make_unique<llvm::raw_null_ostream>();
848}
849
850// Output Manager
851
852void CompilerInstance::setOutputManager(
853 IntrusiveRefCntPtr<llvm::vfs::OutputBackend> NewOutputs) {
854 assert(!OutputMgr && "Already has an output manager");
855 OutputMgr = std::move(NewOutputs);
856}
857
858void CompilerInstance::createOutputManager() {
859 assert(!OutputMgr && "Already has an output manager");
860 OutputMgr = llvm::makeIntrusiveRefCnt<llvm::vfs::OnDiskOutputBackend>();
861}
862
863llvm::vfs::OutputBackend &CompilerInstance::getOutputManager() {
864 assert(OutputMgr);
865 return *OutputMgr;
866}
867
868llvm::vfs::OutputBackend &CompilerInstance::getOrCreateOutputManager() {
869 if (!hasOutputManager())
870 createOutputManager();
871 return getOutputManager();
872}
873
874std::unique_ptr<raw_pwrite_stream> CompilerInstance::createOutputFile(
875 StringRef OutputPath, bool Binary, bool RemoveFileOnSignal,
876 bool UseTemporary, bool CreateMissingDirectories, bool SetOnlyIfDifferent) {
877 Expected<std::unique_ptr<raw_pwrite_stream>> OS =
878 createOutputFileImpl(OutputPath, Binary, RemoveFileOnSignal, UseTemporary,
879 CreateMissingDirectories, SetOnlyIfDifferent);
880 if (OS)
881 return std::move(*OS);
882 getDiagnostics().Report(DiagID: diag::err_fe_unable_to_open_output)
883 << OutputPath << errorToErrorCode(Err: OS.takeError()).message();
884 return nullptr;
885}
886
887Expected<std::unique_ptr<llvm::raw_pwrite_stream>>
888CompilerInstance::createOutputFileImpl(StringRef OutputPath, bool Binary,
889 bool RemoveFileOnSignal,
890 bool UseTemporary,
891 bool CreateMissingDirectories,
892 bool SetOnlyIfDifferent) {
893 assert((!CreateMissingDirectories || UseTemporary) &&
894 "CreateMissingDirectories is only allowed when using temporary files");
895
896 // If '-working-directory' was passed, the output filename should be
897 // relative to that.
898 std::optional<SmallString<128>> AbsPath;
899 if (OutputPath != "-" && !llvm::sys::path::is_absolute(path: OutputPath)) {
900 assert(hasFileManager() &&
901 "File Manager is required to fix up relative path.\n");
902
903 AbsPath.emplace(args&: OutputPath);
904 FileManager::fixupRelativePath(FileSystemOpts: getFileSystemOpts(), Path&: *AbsPath);
905 OutputPath = *AbsPath;
906 }
907
908 using namespace llvm::vfs;
909 Expected<OutputFile> O = getOrCreateOutputManager().createFile(
910 Path: OutputPath,
911 Config: OutputConfig()
912 .setTextWithCRLF(!Binary)
913 .setDiscardOnSignal(RemoveFileOnSignal)
914 .setAtomicWrite(UseTemporary)
915 .setImplyCreateDirectories(UseTemporary && CreateMissingDirectories)
916 .setOnlyIfDifferent(SetOnlyIfDifferent));
917 if (!O)
918 return O.takeError();
919
920 O->discardOnDestroy(Handler: [](llvm::Error E) { consumeError(Err: std::move(E)); });
921 OutputFiles.push_back(x: std::move(*O));
922 return OutputFiles.back().createProxy();
923}
924
925// Initialization Utilities
926
927bool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input){
928 return InitializeSourceManager(Input, Diags&: getDiagnostics(), FileMgr&: getFileManager(),
929 SourceMgr&: getSourceManager());
930}
931
932// static
933bool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input,
934 DiagnosticsEngine &Diags,
935 FileManager &FileMgr,
936 SourceManager &SourceMgr) {
937 SrcMgr::CharacteristicKind Kind =
938 Input.getKind().getFormat() == InputKind::ModuleMap
939 ? Input.isSystem() ? SrcMgr::C_System_ModuleMap
940 : SrcMgr::C_User_ModuleMap
941 : Input.isSystem() ? SrcMgr::C_System : SrcMgr::C_User;
942
943 if (Input.isBuffer()) {
944 SourceMgr.setMainFileID(SourceMgr.createFileID(Buffer: Input.getBuffer(), FileCharacter: Kind));
945 assert(SourceMgr.getMainFileID().isValid() &&
946 "Couldn't establish MainFileID!");
947 return true;
948 }
949
950 StringRef InputFile = Input.getFile();
951
952 // Figure out where to get and map in the main file.
953 auto FileOrErr = InputFile == "-"
954 ? FileMgr.getSTDIN()
955 : FileMgr.getFileRef(Filename: InputFile, /*OpenFile=*/true);
956 if (!FileOrErr) {
957 auto EC = llvm::errorToErrorCode(Err: FileOrErr.takeError());
958 if (InputFile != "-")
959 Diags.Report(DiagID: diag::err_fe_error_reading) << InputFile << EC.message();
960 else
961 Diags.Report(DiagID: diag::err_fe_error_reading_stdin) << EC.message();
962 return false;
963 }
964
965 SourceMgr.setMainFileID(
966 SourceMgr.createFileID(SourceFile: *FileOrErr, IncludePos: SourceLocation(), FileCharacter: Kind));
967
968 assert(SourceMgr.getMainFileID().isValid() &&
969 "Couldn't establish MainFileID!");
970 return true;
971}
972
973// High-Level Operations
974
975void CompilerInstance::PrepareForExecution() {
976 // Set up the frontend timer for -ftime-report. BackendConsumer uses
977 // getTimerGroup() and getFrontendTimer() when TimePasses is set. In the
978 // cc1 driver path this was done in cc1_main before calling
979 // ExecuteCompilerInvocation; we consolidate it here so that all tools
980 // (cc1, clang-repl, libclang, etc.) get consistent behavior.
981 if (getCodeGenOpts().TimePasses && !FrontendTimer) {
982 createFrontendTimer();
983 getFrontendTimer().startTimer();
984 }
985
986 // FIXME: Consider consolidating additional per-instance setup here:
987 // - llvm::timeTraceProfilerInitialize) when TimeTracePath is set.
988 // - Plugin loading (LoadRequestedPlugins) and -mllvm argument processing.
989}
990
991bool CompilerInstance::ExecuteAction(FrontendAction &Act) {
992 assert(hasDiagnostics() && "Diagnostics engine is not initialized!");
993 assert(!getFrontendOpts().ShowHelp && "Client must handle '-help'!");
994 assert(!getFrontendOpts().ShowVersion && "Client must handle '-version'!");
995
996 llvm::TimeTraceScope TimeScope("ExecuteCompiler");
997
998 PrepareForExecution();
999
1000 // Mark this point as the bottom of the stack if we don't have somewhere
1001 // better. We generally expect frontend actions to be invoked with (nearly)
1002 // DesiredStackSpace available.
1003 noteBottomOfStack();
1004
1005 raw_ostream &OS = getVerboseOutputStream();
1006
1007 if (!Act.PrepareToExecute(CI&: *this))
1008 return false;
1009
1010 if (!createTarget())
1011 return false;
1012
1013 // rewriter project will change target built-in bool type from its default.
1014 if (getFrontendOpts().ProgramAction == frontend::RewriteObjC)
1015 getTarget().noSignedCharForObjCBool();
1016
1017 // Validate/process some options.
1018 if (getHeaderSearchOpts().Verbose)
1019 OS << "clang -cc1 version " CLANG_VERSION_STRING << " based upon LLVM "
1020 << LLVM_VERSION_STRING << " default target "
1021 << llvm::sys::getDefaultTargetTriple() << "\n";
1022
1023 if (getFrontendOpts().ShowStats || !getFrontendOpts().StatsFile.empty())
1024 llvm::EnableStatistics(DoPrintOnExit: false);
1025
1026 // Sort vectors containing toc data and no toc data variables to facilitate
1027 // binary search later.
1028 llvm::sort(C&: getCodeGenOpts().TocDataVarsUserSpecified);
1029 llvm::sort(C&: getCodeGenOpts().NoTocDataVars);
1030
1031 for (const FrontendInputFile &FIF : getFrontendOpts().Inputs) {
1032 // Reset the ID tables if we are reusing the SourceManager and parsing
1033 // regular files.
1034 if (hasSourceManager() && !Act.isModelParsingAction())
1035 getSourceManager().clearIDTables();
1036
1037 ModuleImportResults.clear();
1038
1039 if (Act.BeginSourceFile(CI&: *this, Input: FIF)) {
1040 if (llvm::Error Err = Act.Execute()) {
1041 consumeError(Err: std::move(Err)); // FIXME this drops errors on the floor.
1042 }
1043 Act.EndSourceFile();
1044 }
1045 }
1046
1047 printDiagnosticStats();
1048
1049 if (getFrontendOpts().ShowStats) {
1050 if (hasFileManager()) {
1051 getFileManager().PrintStats();
1052 OS << '\n';
1053 }
1054 llvm::PrintStatistics(OS);
1055 }
1056 StringRef StatsFile = getFrontendOpts().StatsFile;
1057 if (!StatsFile.empty()) {
1058 llvm::sys::fs::OpenFlags FileFlags = llvm::sys::fs::OF_TextWithCRLF;
1059 if (getFrontendOpts().AppendStats)
1060 FileFlags |= llvm::sys::fs::OF_Append;
1061 std::error_code EC;
1062 auto StatS =
1063 std::make_unique<llvm::raw_fd_ostream>(args&: StatsFile, args&: EC, args&: FileFlags);
1064 if (EC) {
1065 getDiagnostics().Report(DiagID: diag::warn_fe_unable_to_open_stats_file)
1066 << StatsFile << EC.message();
1067 } else {
1068 llvm::PrintStatisticsJSON(OS&: *StatS);
1069 }
1070 }
1071
1072 return !getDiagnostics().getClient()->getNumErrors();
1073}
1074
1075void CompilerInstance::printDiagnosticStats() {
1076 if (!getDiagnosticOpts().ShowCarets)
1077 return;
1078
1079 raw_ostream &OS = getVerboseOutputStream();
1080
1081 // We can have multiple diagnostics sharing one diagnostic client.
1082 // Get the total number of warnings/errors from the client.
1083 unsigned NumWarnings = getDiagnostics().getClient()->getNumWarnings();
1084 unsigned NumErrors = getDiagnostics().getClient()->getNumErrors();
1085
1086 if (NumWarnings)
1087 OS << NumWarnings << " warning" << (NumWarnings == 1 ? "" : "s");
1088 if (NumWarnings && NumErrors)
1089 OS << " and ";
1090 if (NumErrors)
1091 OS << NumErrors << " error" << (NumErrors == 1 ? "" : "s");
1092 if (NumWarnings || NumErrors) {
1093 OS << " generated";
1094 if (getLangOpts().CUDA) {
1095 if (!getLangOpts().CUDAIsDevice) {
1096 OS << " when compiling for host";
1097 } else {
1098 OS << " when compiling for "
1099 << (!getTargetOpts().CPU.empty() ? getTargetOpts().CPU
1100 : getTarget().getTriple().str());
1101 }
1102 }
1103 OS << ".\n";
1104 }
1105}
1106
1107void CompilerInstance::LoadRequestedPlugins() {
1108 // Load any requested plugins.
1109 for (const std::string &Path : getFrontendOpts().Plugins) {
1110 std::string Error;
1111 if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(Filename: Path.c_str(), ErrMsg: &Error))
1112 getDiagnostics().Report(DiagID: diag::err_fe_unable_to_load_plugin)
1113 << Path << Error;
1114 }
1115
1116 // Load and store pass plugins for the back-end.
1117 for (const std::string &Path : getCodeGenOpts().PassPlugins) {
1118 if (auto PassPlugin = llvm::PassPlugin::load(Filename: Path)) {
1119 PassPlugins.emplace_back(args: std::make_unique<llvm::PassPlugin>(args&: *PassPlugin));
1120 } else {
1121 getDiagnostics().Report(DiagID: diag::err_fe_unable_to_load_plugin)
1122 << Path << toString(E: PassPlugin.takeError());
1123 }
1124 }
1125
1126 // Check if any of the loaded plugins replaces the main AST action
1127 for (const FrontendPluginRegistry::entry &Plugin :
1128 FrontendPluginRegistry::entries()) {
1129 std::unique_ptr<PluginASTAction> P(Plugin.instantiate());
1130 if (P->getActionType() == PluginASTAction::ReplaceAction) {
1131 getFrontendOpts().ProgramAction = clang::frontend::PluginAction;
1132 getFrontendOpts().ActionName = Plugin.getName().str();
1133 break;
1134 }
1135 }
1136}
1137
1138void CompilerInstance::parseLLVMArgs() {
1139 if (!getFrontendOpts().LLVMArgs.empty()) {
1140 unsigned NumArgs = getFrontendOpts().LLVMArgs.size();
1141 auto Args = std::make_unique<const char *[]>(num: NumArgs + 2);
1142 Args[0] = "clang (LLVM option parsing)";
1143 for (unsigned i = 0; i != NumArgs; ++i)
1144 Args[i + 1] = getFrontendOpts().LLVMArgs[i].c_str();
1145 Args[NumArgs + 1] = nullptr;
1146 llvm::cl::parseCommandLineOptions(Context&: LibraryOptions,
1147 Args: ArrayRef(Args.get(), NumArgs + 1),
1148 /*Overview=*/"", /*Errs=*/nullptr,
1149 /*VFS=*/&getVirtualFileSystem());
1150 }
1151}
1152
1153/// Determine the appropriate source input kind based on language
1154/// options.
1155static Language getLanguageFromOptions(const LangOptions &LangOpts) {
1156 if (LangOpts.OpenCL)
1157 return Language::OpenCL;
1158 if (LangOpts.CUDA)
1159 return Language::CUDA;
1160 if (LangOpts.ObjC)
1161 return LangOpts.CPlusPlus ? Language::ObjCXX : Language::ObjC;
1162 return LangOpts.CPlusPlus ? Language::CXX : Language::C;
1163}
1164
1165std::unique_ptr<CompilerInstance> CompilerInstance::cloneForModuleCompileImpl(
1166 SourceLocation ImportLoc, StringRef ModuleName, FrontendInputFile Input,
1167 StringRef OriginalModuleMapFile, StringRef ModuleFileName,
1168 ArrayRef<std::string> DirectoryDependencies,
1169 std::optional<ThreadSafeCloneConfig> ThreadSafeConfig) {
1170 // Construct a compiler invocation for creating this module.
1171 auto Invocation = std::make_shared<CompilerInvocation>(args&: getInvocation());
1172
1173 PreprocessorOptions &PPOpts = Invocation->getPreprocessorOpts();
1174
1175 // For any options that aren't intended to affect how a module is built,
1176 // reset them to their default values.
1177 Invocation->resetNonModularOptions();
1178
1179 // Remove any macro definitions that are explicitly ignored by the module.
1180 // They aren't supposed to affect how the module is built anyway.
1181 HeaderSearchOptions &HSOpts = Invocation->getHeaderSearchOpts();
1182 llvm::erase_if(C&: PPOpts.Macros,
1183 P: [&HSOpts](const std::pair<std::string, bool> &def) {
1184 StringRef MacroDef = def.first;
1185 return HSOpts.ModulesIgnoreMacros.contains(
1186 key: llvm::CachedHashString(MacroDef.split(Separator: '=').first));
1187 });
1188 HSOpts.ModulesIgnoreMacros.clear();
1189
1190 // Remove any search paths that are explicitly ignored by the module.
1191 // They aren't supposed to affect how the module is built anyway.
1192 if (!HSOpts.ModulesIgnoreSearchPaths.empty())
1193 llvm::erase_if(C&: HSOpts.UserEntries,
1194 P: [&HSOpts](const HeaderSearchOptions::Entry &E) {
1195 return HSOpts.ModulesIgnoreSearchPaths.contains(
1196 key: llvm::CachedHashString(E.Path));
1197 });
1198 HSOpts.ModulesIgnoreSearchPaths.clear();
1199
1200 // If the original compiler invocation had -fmodule-name, pass it through.
1201 Invocation->getLangOpts().ModuleName =
1202 getInvocation().getLangOpts().ModuleName;
1203
1204 // Note the name of the module we're building.
1205 Invocation->getLangOpts().CurrentModule = std::string(ModuleName);
1206
1207 // If there is a module map file, build the module using the module map.
1208 // Set up the inputs/outputs so that we build the module from its umbrella
1209 // header.
1210 FrontendOptions &FrontendOpts = Invocation->getFrontendOpts();
1211 FrontendOpts.OutputFile = ModuleFileName.str();
1212 FrontendOpts.DisableFree = false;
1213 FrontendOpts.GenerateGlobalModuleIndex = false;
1214 FrontendOpts.BuildingImplicitModule = true;
1215 FrontendOpts.OriginalModuleMap = std::string(OriginalModuleMapFile);
1216 // Force implicitly-built modules to hash the content of the module file.
1217 HSOpts.ModulesHashContent = true;
1218 FrontendOpts.Inputs = {std::move(Input)};
1219
1220 // Don't free the remapped file buffers; they are owned by our caller.
1221 PPOpts.RetainRemappedFileBuffers = true;
1222
1223 DiagnosticOptions &DiagOpts = Invocation->getDiagnosticOpts();
1224
1225 DiagOpts.VerifyDiagnostics = 0;
1226 assert(getInvocation().computeContextHash() ==
1227 Invocation->computeContextHash() &&
1228 "Module hash mismatch!");
1229
1230 std::shared_ptr<ModuleCache> ModCache;
1231 if (ThreadSafeConfig) {
1232 ModCache = ThreadSafeConfig->getModuleCache();
1233 } else {
1234 ModCache = this->ModCache;
1235 }
1236
1237 // Construct a compiler instance that will be used to create the module.
1238 auto InstancePtr = std::make_unique<CompilerInstance>(
1239 args: std::move(Invocation), args: getPCHContainerOperations(), args: std::move(ModCache));
1240 auto &Instance = *InstancePtr;
1241
1242 auto &Inv = Instance.getInvocation();
1243
1244 if (ThreadSafeConfig) {
1245 Instance.setVirtualFileSystem(ThreadSafeConfig->getVFS());
1246 Instance.createFileManager();
1247 } else if (FrontendOpts.ModulesShareFileManager) {
1248 Instance.setVirtualFileSystem(getVirtualFileSystemPtr());
1249 Instance.setFileManager(getFileManagerPtr());
1250 } else {
1251 Instance.setVirtualFileSystem(getVirtualFileSystemPtr());
1252 Instance.createFileManager();
1253 }
1254
1255 if (ThreadSafeConfig) {
1256 Instance.createDiagnostics(Client: &ThreadSafeConfig->getDiagConsumer(),
1257 /*ShouldOwnClient=*/false);
1258 } else {
1259 Instance.createDiagnostics(
1260 Client: new ForwardingDiagnosticConsumer(getDiagnosticClient()),
1261 /*ShouldOwnClient=*/true);
1262 }
1263 if (llvm::is_contained(Range&: DiagOpts.SystemHeaderWarningsModules, Element: ModuleName))
1264 Instance.getDiagnostics().setSuppressSystemWarnings(false);
1265
1266 Instance.createSourceManager();
1267 SourceManager &SourceMgr = Instance.getSourceManager();
1268
1269 if (ThreadSafeConfig) {
1270 // Detecting cycles in the module graph is responsibility of the client.
1271 } else {
1272 // Note that this module is part of the module build stack, so that we
1273 // can detect cycles in the module graph.
1274 SourceMgr.setModuleBuildStack(getSourceManager().getModuleBuildStack());
1275 SourceMgr.pushModuleBuildStack(
1276 moduleName: ModuleName, importLoc: FullSourceLoc(ImportLoc, getSourceManager()));
1277 }
1278
1279 // Make a copy for the new instance.
1280 Instance.FailedModules = FailedModules;
1281
1282 // An inferred framework is built from module map text printed by this
1283 // instance rather than by repeating the inference, so directories the
1284 // inference enumerated (its Frameworks subdirectory) are only known here.
1285 Instance.setInheritedDirectoryDependencies(DirectoryDependencies);
1286
1287 // Pass along the GenModuleActionWrapper callback.
1288 Instance.setGenModuleActionWrapper(getGenModuleActionWrapper());
1289
1290 if (GetDependencyDirectives)
1291 Instance.GetDependencyDirectives =
1292 GetDependencyDirectives->cloneFor(FileMgr&: Instance.getFileManager());
1293
1294 if (ThreadSafeConfig) {
1295 Instance.setModuleDepCollector(ThreadSafeConfig->getModuleDepCollector());
1296 } else {
1297 // If we're collecting module dependencies, we need to share a collector
1298 // between all of the module CompilerInstances. Other than that, we don't
1299 // want to produce any dependency output from the module build.
1300 Instance.setModuleDepCollector(getModuleDepCollector());
1301 }
1302 Inv.getDependencyOutputOpts() = DependencyOutputOptions();
1303
1304 return InstancePtr;
1305}
1306
1307namespace {
1308class PrettyStackTraceBuildModule : public llvm::PrettyStackTraceEntry {
1309 StringRef ModuleName;
1310 StringRef ModuleFileName;
1311
1312public:
1313 PrettyStackTraceBuildModule(StringRef ModuleName, StringRef ModuleFileName)
1314 : ModuleName(ModuleName), ModuleFileName(ModuleFileName) {}
1315 void print(raw_ostream &OS) const override {
1316 OS << "Building module '" << ModuleName << "' as '" << ModuleFileName
1317 << "'\n";
1318 }
1319};
1320} // namespace
1321
1322std::unique_ptr<llvm::MemoryBuffer>
1323CompilerInstance::compileModule(SourceLocation ImportLoc, StringRef ModuleName,
1324 StringRef ModuleFileName,
1325 CompilerInstance &Instance) {
1326 PrettyStackTraceBuildModule CrashInfo(ModuleName, ModuleFileName);
1327 llvm::TimeTraceScope TimeScope("Module Compile", ModuleName);
1328
1329 // Never compile a module that's already finalized - this would cause the
1330 // existing module to be freed, causing crashes if it is later referenced
1331 if (getModuleCache().getInMemoryModuleCache().isPCMFinal(Filename: ModuleFileName)) {
1332 getDiagnostics().Report(Loc: ImportLoc, DiagID: diag::err_module_rebuild_finalized)
1333 << ModuleName;
1334 return nullptr;
1335 }
1336
1337 getDiagnostics().Report(Loc: ImportLoc, DiagID: diag::remark_module_build)
1338 << ModuleName << ModuleFileName;
1339
1340 SmallString<0> Buffer;
1341
1342 // Execute the action to actually build the module in-place. Use a separate
1343 // thread so that we get a stack large enough.
1344 uint64_t ParentTID = llvm::get_threadid();
1345 bool Crashed = !llvm::CrashRecoveryContext().RunSafelyOnNewStack(
1346 [&]() {
1347 getModuleCache().getLogger().log()
1348 << "module_compile_thread: parent=" << ParentTID
1349 << " pcm_compile: " << ModuleFileName;
1350
1351 auto OS = std::make_unique<llvm::raw_svector_ostream>(args&: Buffer);
1352
1353 std::unique_ptr<FrontendAction> Action =
1354 std::make_unique<GenerateModuleFromModuleMapAction>(args: std::move(OS));
1355
1356 if (auto WrapGenModuleAction = Instance.getGenModuleActionWrapper())
1357 Action = WrapGenModuleAction(Instance.getFrontendOpts(),
1358 std::move(Action));
1359
1360 Instance.ExecuteAction(Act&: *Action);
1361 },
1362 RequestedStackSize: DesiredStackSize);
1363
1364 getDiagnostics().Report(Loc: ImportLoc, DiagID: diag::remark_module_build_done)
1365 << ModuleName;
1366
1367 // Propagate the statistics to the parent FileManager.
1368 if (!getFrontendOpts().ModulesShareFileManager)
1369 getFileManager().AddStats(Other: Instance.getFileManager());
1370
1371 // Propagate the failed modules to the parent instance.
1372 FailedModules = std::move(Instance.FailedModules);
1373
1374 if (Crashed) {
1375 // Clear the ASTConsumer if it hasn't been already, in case it owns streams
1376 // that must be closed before clearing output files.
1377 Instance.setSema(nullptr);
1378 Instance.setASTConsumer(nullptr);
1379
1380 // Delete any remaining temporary files related to Instance.
1381 Instance.clearOutputFiles(/*EraseFiles=*/true);
1382 }
1383
1384 // We've rebuilt a module. If we're allowed to generate or update the global
1385 // module index, record that fact in the importing compiler instance.
1386 if (getFrontendOpts().GenerateGlobalModuleIndex) {
1387 setBuildGlobalModuleIndex(true);
1388 }
1389
1390 if (Crashed)
1391 return nullptr;
1392
1393 // Unless \p AllowPCMWithCompilerErrors is set, return 'failure' if errors
1394 // occurred.
1395 if (Instance.getDiagnostics().hasErrorOccurred() &&
1396 !Instance.getFrontendOpts().AllowPCMWithCompilerErrors)
1397 return nullptr;
1398
1399 return std::make_unique<llvm::SmallVectorMemoryBuffer>(
1400 args: std::move(Buffer), args&: Instance.getFrontendOpts().OutputFile);
1401}
1402
1403static OptionalFileEntryRef getPublicModuleMap(FileEntryRef File,
1404 FileManager &FileMgr) {
1405 StringRef Filename = llvm::sys::path::filename(path: File.getName());
1406 SmallString<128> PublicFilename(File.getDir().getName());
1407 if (Filename == "module_private.map")
1408 llvm::sys::path::append(path&: PublicFilename, a: "module.map");
1409 else if (Filename == "module.private.modulemap")
1410 llvm::sys::path::append(path&: PublicFilename, a: "module.modulemap");
1411 else
1412 return std::nullopt;
1413 return FileMgr.getOptionalFileRef(Filename: PublicFilename);
1414}
1415
1416std::unique_ptr<CompilerInstance> CompilerInstance::cloneForModuleCompile(
1417 SourceLocation ImportLoc, const Module *Module, StringRef ModuleFileName,
1418 std::optional<ThreadSafeCloneConfig> ThreadSafeConfig) {
1419 StringRef ModuleName = Module->getTopLevelModuleName();
1420
1421 InputKind IK(getLanguageFromOptions(LangOpts: getLangOpts()), InputKind::ModuleMap);
1422
1423 // Get or create the module map that we'll use to build this module.
1424 ModuleMap &ModMap = getPreprocessor().getHeaderSearchInfo().getModuleMap();
1425 SourceManager &SourceMgr = getSourceManager();
1426
1427 if (FileID ModuleMapFID = ModMap.getContainingModuleMapFileID(Module);
1428 ModuleMapFID.isValid()) {
1429 // We want to use the top-level module map. If we don't, the compiling
1430 // instance may think the containing module map is a top-level one, while
1431 // the importing instance knows it's included from a parent module map via
1432 // the extern directive. This mismatch could bite us later.
1433 SourceLocation Loc = SourceMgr.getIncludeLoc(FID: ModuleMapFID);
1434 while (Loc.isValid() && isModuleMap(CK: SourceMgr.getFileCharacteristic(Loc))) {
1435 ModuleMapFID = SourceMgr.getFileID(SpellingLoc: Loc);
1436 Loc = SourceMgr.getIncludeLoc(FID: ModuleMapFID);
1437 }
1438
1439 OptionalFileEntryRef ModuleMapFile =
1440 SourceMgr.getFileEntryRefForID(FID: ModuleMapFID);
1441 assert(ModuleMapFile && "Top-level module map with no FileID");
1442
1443 // Canonicalize compilation to start with the public module map. This is
1444 // vital for submodules declarations in the private module maps to be
1445 // correctly parsed when depending on a top level module in the public one.
1446 if (OptionalFileEntryRef PublicMMFile =
1447 getPublicModuleMap(File: *ModuleMapFile, FileMgr&: getFileManager()))
1448 ModuleMapFile = PublicMMFile;
1449
1450 StringRef ModuleMapFilePath = ModuleMapFile->getNameAsRequested();
1451
1452 // Use the systemness of the module map as parsed instead of using the
1453 // IsSystem attribute of the module. If the module has [system] but the
1454 // module map is not in a system path, then this would incorrectly parse
1455 // any other modules in that module map as system too.
1456 const SrcMgr::SLocEntry &SLoc = SourceMgr.getSLocEntry(FID: ModuleMapFID);
1457 bool IsSystem = isSystem(CK: SLoc.getFile().getFileCharacteristic());
1458
1459 // Use the module map where this module resides.
1460 return cloneForModuleCompileImpl(
1461 ImportLoc, ModuleName,
1462 Input: FrontendInputFile(ModuleMapFilePath, IK, IsSystem),
1463 OriginalModuleMapFile: ModMap.getModuleMapFileForUniquing(M: Module)->getName(), ModuleFileName,
1464 DirectoryDependencies: Module->getDirectoryDependencies(), ThreadSafeConfig: std::move(ThreadSafeConfig));
1465 }
1466
1467 // FIXME: We only need to fake up an input file here as a way of
1468 // transporting the module's directory to the module map parser. We should
1469 // be able to do that more directly, and parse from a memory buffer without
1470 // inventing this file.
1471 SmallString<128> FakeModuleMapFile(Module->Directory->getName());
1472 llvm::sys::path::append(path&: FakeModuleMapFile, a: "__inferred_module.map");
1473
1474 std::string InferredModuleMapContent;
1475 llvm::raw_string_ostream OS(InferredModuleMapContent);
1476 Module->print(OS);
1477
1478 auto Instance = cloneForModuleCompileImpl(
1479 ImportLoc, ModuleName,
1480 Input: FrontendInputFile(FakeModuleMapFile, IK, +Module->IsSystem),
1481 OriginalModuleMapFile: ModMap.getModuleMapFileForUniquing(M: Module)->getName(), ModuleFileName,
1482 DirectoryDependencies: Module->getDirectoryDependencies(), ThreadSafeConfig: std::move(ThreadSafeConfig));
1483
1484 std::unique_ptr<llvm::MemoryBuffer> ModuleMapBuffer =
1485 llvm::MemoryBuffer::getMemBufferCopy(InputData: InferredModuleMapContent);
1486 FileEntryRef ModuleMapFile = Instance->getFileManager().getVirtualFileRef(
1487 Filename: FakeModuleMapFile, Size: InferredModuleMapContent.size(), ModificationTime: 0);
1488 Instance->getSourceManager().overrideFileContents(SourceFile: ModuleMapFile,
1489 Buffer: std::move(ModuleMapBuffer));
1490
1491 return Instance;
1492}
1493
1494/// Read the AST right after compiling the module.
1495/// Returns true on success, false on failure.
1496static bool readASTAfterCompileModule(CompilerInstance &ImportingInstance,
1497 SourceLocation ImportLoc,
1498 SourceLocation ModuleNameLoc,
1499 Module *Module,
1500 ModuleFileName ModuleFileName,
1501 bool *OutOfDate, bool *Missing) {
1502 DiagnosticsEngine &Diags = ImportingInstance.getDiagnostics();
1503
1504 unsigned ModuleLoadCapabilities = ASTReader::ARR_Missing;
1505 if (OutOfDate)
1506 ModuleLoadCapabilities |= ASTReader::ARR_OutOfDate;
1507
1508 // Try to read the module file, now that we've compiled it.
1509 ASTReader::ASTReadResult ReadResult =
1510 ImportingInstance.getASTReader()->ReadAST(
1511 FileName: ModuleFileName, Type: serialization::MK_ImplicitModule, ImportLoc,
1512 ClientLoadCapabilities: ModuleLoadCapabilities);
1513 if (ReadResult == ASTReader::Success)
1514 return true;
1515
1516 // The caller wants to handle out-of-date failures.
1517 if (OutOfDate && ReadResult == ASTReader::OutOfDate) {
1518 *OutOfDate = true;
1519 return false;
1520 }
1521
1522 // The caller wants to handle missing module files.
1523 if (Missing && ReadResult == ASTReader::Missing) {
1524 *Missing = true;
1525 return false;
1526 }
1527
1528 // The ASTReader didn't diagnose the error, so conservatively report it.
1529 if (ReadResult == ASTReader::Missing || !Diags.hasErrorOccurred())
1530 Diags.Report(Loc: ModuleNameLoc, DiagID: diag::err_module_not_built)
1531 << Module->Name << SourceRange(ImportLoc, ModuleNameLoc);
1532
1533 return false;
1534}
1535
1536/// Compile a module in a separate compiler instance.
1537/// Returns true on success, false on failure.
1538static bool compileModuleImpl(CompilerInstance &ImportingInstance,
1539 SourceLocation ImportLoc,
1540 SourceLocation ModuleNameLoc, Module *Module,
1541 ModuleFileName ModuleFileName) {
1542 std::unique_ptr<llvm::MemoryBuffer> Buffer;
1543
1544 {
1545 auto Instance = ImportingInstance.cloneForModuleCompile(
1546 ImportLoc: ModuleNameLoc, Module, ModuleFileName);
1547
1548 Buffer = ImportingInstance.compileModule(ImportLoc: ModuleNameLoc,
1549 ModuleName: Module->getTopLevelModuleName(),
1550 ModuleFileName, Instance&: *Instance);
1551
1552 if (!Buffer) {
1553 ImportingInstance.getDiagnostics().Report(Loc: ModuleNameLoc,
1554 DiagID: diag::err_module_not_built)
1555 << Module->Name << SourceRange(ImportLoc, ModuleNameLoc);
1556 return false;
1557 }
1558 }
1559
1560 off_t Size;
1561 time_t ModTime;
1562 std::error_code EC = ImportingInstance.getModuleCache().write(
1563 Path: ModuleFileName, Buffer: *Buffer, Size, ModTime);
1564 if (EC) {
1565 ImportingInstance.getDiagnostics().Report(Loc: ModuleNameLoc,
1566 DiagID: diag::err_module_not_written)
1567 << Module->Name << ModuleFileName << EC.message()
1568 << SourceRange(ImportLoc, ModuleNameLoc);
1569 return false;
1570 }
1571
1572 // The module is built successfully, we can update its timestamp now.
1573 if (ImportingInstance.getPreprocessor()
1574 .getHeaderSearchInfo()
1575 .getHeaderSearchOpts()
1576 .ModulesValidateOncePerBuildSession) {
1577 ImportingInstance.getModuleCache().updateModuleTimestamp(ModuleFilename: ModuleFileName);
1578 }
1579
1580 // This isn't strictly necessary, but it's more efficient to extract the AST
1581 // file (which may be wrapped in an object file) now rather than doing so
1582 // repeatedly in the readers.
1583 const PCHContainerReader &Rdr = ImportingInstance.getPCHContainerReader();
1584 StringRef ExtractedBuffer = Rdr.ExtractPCH(Buffer: *Buffer);
1585 // FIXME: Avoid the copy here by having InMemoryModuleCache accept both the
1586 // owning buffer and the StringRef.
1587 Buffer = llvm::MemoryBuffer::getMemBufferCopy(InputData: ExtractedBuffer);
1588
1589 ImportingInstance.getModuleCache().getInMemoryModuleCache().addBuiltPCM(
1590 Filename: ModuleFileName, Buffer: std::move(Buffer), Size, ModTime);
1591
1592 return true;
1593}
1594
1595/// The result of `compileModuleBehindLockOrRead()`.
1596enum class CompileOrReadResult : uint8_t {
1597 /// We failed to compile the module.
1598 FailedToCompile,
1599 /// We successfully compiled the module and we still need to read it.
1600 Compiled,
1601 /// We failed to read the module file compiled by another instance.
1602 FailedToRead,
1603 /// We read a module file compiled by another instance.
1604 Read,
1605};
1606
1607/// Attempt to compile the module in a separate compiler instance behind a lock
1608/// (to avoid building the same module in multiple compiler instances), or read
1609/// the AST produced by another compiler instance.
1610static CompileOrReadResult
1611compileModuleBehindLockOrRead(CompilerInstance &ImportingInstance,
1612 SourceLocation ImportLoc,
1613 SourceLocation ModuleNameLoc, Module *Module,
1614 ModuleFileName ModuleFileName) {
1615 DiagnosticsEngine &Diags = ImportingInstance.getDiagnostics();
1616
1617 Diags.Report(Loc: ModuleNameLoc, DiagID: diag::remark_module_lock)
1618 << ModuleFileName << Module->Name;
1619
1620 auto &ModuleCache = ImportingInstance.getModuleCache();
1621
1622 while (true) {
1623 auto Lock = ModuleCache.getLock(ModuleFilename: ModuleFileName);
1624 bool Owned;
1625 if (llvm::Error Err = Lock->tryLock().moveInto(Value&: Owned)) {
1626 // ModuleCache takes care of correctness and locks are only necessary for
1627 // performance. Fallback to building the module in case of any lock
1628 // related errors.
1629 Diags.Report(Loc: ModuleNameLoc, DiagID: diag::remark_module_lock_failure)
1630 << Module->Name << toString(E: std::move(Err));
1631 if (!compileModuleImpl(ImportingInstance, ImportLoc, ModuleNameLoc,
1632 Module, ModuleFileName))
1633 return CompileOrReadResult::FailedToCompile;
1634 return CompileOrReadResult::Compiled;
1635 }
1636 if (Owned) {
1637 // We're responsible for building the module ourselves.
1638 if (!compileModuleImpl(ImportingInstance, ImportLoc, ModuleNameLoc,
1639 Module, ModuleFileName))
1640 return CompileOrReadResult::FailedToCompile;
1641 return CompileOrReadResult::Compiled;
1642 }
1643
1644 // Someone else is responsible for building the module. Wait for them to
1645 // finish.
1646 unsigned Timeout =
1647 ImportingInstance.getFrontendOpts().ImplicitModulesLockTimeoutSeconds;
1648 switch (Lock->waitForUnlockFor(MaxSeconds: std::chrono::seconds(Timeout))) {
1649 case llvm::WaitForUnlockResult::Success:
1650 break; // The interesting case.
1651 case llvm::WaitForUnlockResult::OwnerDied:
1652 continue; // try again to get the lock.
1653 case llvm::WaitForUnlockResult::Timeout:
1654 // Since the InMemoryModuleCache takes care of correctness, we try waiting
1655 // for someone else to complete the build so that it does not happen
1656 // twice. In case of timeout, try to build it ourselves again.
1657 Diags.Report(Loc: ModuleNameLoc, DiagID: diag::remark_module_lock_timeout)
1658 << Module->Name;
1659 // Clear the lock file so that future invocations can make progress.
1660 Lock->unsafeUnlock();
1661 continue;
1662 }
1663
1664 // Read the module that was just written by someone else.
1665 bool OutOfDate = false;
1666 bool Missing = false;
1667 if (readASTAfterCompileModule(ImportingInstance, ImportLoc, ModuleNameLoc,
1668 Module, ModuleFileName, OutOfDate: &OutOfDate, Missing: &Missing))
1669 return CompileOrReadResult::Read;
1670 if (!OutOfDate && !Missing)
1671 return CompileOrReadResult::FailedToRead;
1672
1673 // The module may be missing or out of date in the presence of file system
1674 // races. It may also be out of date if one of its imports depends on header
1675 // search paths that are not consistent with this ImportingInstance.
1676 // Try again...
1677 }
1678}
1679
1680/// Compile a module in a separate compiler instance and read the AST,
1681/// returning true if the module compiles without errors, potentially using a
1682/// lock manager to avoid building the same module in multiple compiler
1683/// instances.
1684static bool compileModuleAndReadAST(CompilerInstance &ImportingInstance,
1685 SourceLocation ImportLoc,
1686 SourceLocation ModuleNameLoc,
1687 Module *Module,
1688 ModuleFileName ModuleFileName) {
1689 if (ImportingInstance.getInvocation()
1690 .getFrontendOpts()
1691 .BuildingImplicitModuleUsesLock) {
1692 switch (compileModuleBehindLockOrRead(
1693 ImportingInstance, ImportLoc, ModuleNameLoc, Module, ModuleFileName)) {
1694 case CompileOrReadResult::FailedToRead:
1695 case CompileOrReadResult::FailedToCompile:
1696 return false;
1697 case CompileOrReadResult::Read:
1698 return true;
1699 case CompileOrReadResult::Compiled:
1700 // We successfully compiled the module under a lock. Let's read it from
1701 // the in-memory module cache now.
1702 break;
1703 }
1704 } else {
1705 if (!compileModuleImpl(ImportingInstance, ImportLoc, ModuleNameLoc, Module,
1706 ModuleFileName))
1707 return false;
1708 }
1709
1710 return readASTAfterCompileModule(ImportingInstance, ImportLoc, ModuleNameLoc,
1711 Module, ModuleFileName,
1712 /*OutOfDate=*/nullptr, /*Missing=*/nullptr);
1713}
1714
1715/// Diagnose differences between the current definition of the given
1716/// configuration macro and the definition provided on the command line.
1717static void checkConfigMacro(Preprocessor &PP, StringRef ConfigMacro,
1718 Module *Mod, SourceLocation ImportLoc) {
1719 IdentifierInfo *Id = PP.getIdentifierInfo(Name: ConfigMacro);
1720 SourceManager &SourceMgr = PP.getSourceManager();
1721
1722 // If this identifier has never had a macro definition, then it could
1723 // not have changed.
1724 if (!Id->hadMacroDefinition())
1725 return;
1726 auto *LatestLocalMD = PP.getLocalMacroDirectiveHistory(II: Id);
1727
1728 // Find the macro definition from the command line.
1729 MacroInfo *CmdLineDefinition = nullptr;
1730 for (auto *MD = LatestLocalMD; MD; MD = MD->getPrevious()) {
1731 SourceLocation MDLoc = MD->getLocation();
1732 FileID FID = SourceMgr.getFileID(SpellingLoc: MDLoc);
1733 if (FID.isInvalid())
1734 continue;
1735 // We only care about the predefines buffer, or if the macro is defined
1736 // over the command line transitively through a PCH.
1737 if (FID != PP.getPredefinesFileID() &&
1738 !SourceMgr.isWrittenInCommandLineFile(Loc: MDLoc))
1739 continue;
1740 if (auto *DMD = dyn_cast<DefMacroDirective>(Val: MD))
1741 CmdLineDefinition = DMD->getMacroInfo();
1742 break;
1743 }
1744
1745 auto *CurrentDefinition = PP.getMacroInfo(II: Id);
1746 if (CurrentDefinition == CmdLineDefinition) {
1747 // Macro matches. Nothing to do.
1748 } else if (!CurrentDefinition) {
1749 // This macro was defined on the command line, then #undef'd later.
1750 // Complain.
1751 PP.Diag(Loc: ImportLoc, DiagID: diag::warn_module_config_macro_undef)
1752 << true << ConfigMacro << Mod->getFullModuleName();
1753 auto LatestDef = LatestLocalMD->getDefinition();
1754 assert(LatestDef.isUndefined() &&
1755 "predefined macro went away with no #undef?");
1756 PP.Diag(Loc: LatestDef.getUndefLocation(), DiagID: diag::note_module_def_undef_here)
1757 << true;
1758 return;
1759 } else if (!CmdLineDefinition) {
1760 // There was no definition for this macro in the command line,
1761 // but there was a local definition. Complain.
1762 PP.Diag(Loc: ImportLoc, DiagID: diag::warn_module_config_macro_undef)
1763 << false << ConfigMacro << Mod->getFullModuleName();
1764 PP.Diag(Loc: CurrentDefinition->getDefinitionLoc(),
1765 DiagID: diag::note_module_def_undef_here)
1766 << false;
1767 } else if (!CurrentDefinition->isIdenticalTo(Other: *CmdLineDefinition, PP,
1768 /*Syntactically=*/true)) {
1769 // The macro definitions differ.
1770 PP.Diag(Loc: ImportLoc, DiagID: diag::warn_module_config_macro_undef)
1771 << false << ConfigMacro << Mod->getFullModuleName();
1772 PP.Diag(Loc: CurrentDefinition->getDefinitionLoc(),
1773 DiagID: diag::note_module_def_undef_here)
1774 << false;
1775 }
1776}
1777
1778static void checkConfigMacros(Preprocessor &PP, Module *M,
1779 SourceLocation ImportLoc) {
1780 clang::Module *TopModule = M->getTopLevelModule();
1781 for (const StringRef ConMacro : TopModule->ConfigMacros) {
1782 checkConfigMacro(PP, ConfigMacro: ConMacro, Mod: M, ImportLoc);
1783 }
1784}
1785
1786void CompilerInstance::createASTReader() {
1787 if (TheASTReader)
1788 return;
1789
1790 if (!hasASTContext())
1791 createASTContext();
1792
1793 // If we're implicitly building modules but not currently recursively
1794 // building a module, check whether we need to prune the module cache.
1795 if (getSourceManager().getModuleBuildStack().empty() &&
1796 !getPreprocessor()
1797 .getHeaderSearchInfo()
1798 .getSpecificModuleCachePath()
1799 .empty())
1800 ModCache->maybePrune(Path: getHeaderSearchOpts().ModuleCachePath,
1801 PruneInterval: getHeaderSearchOpts().ModuleCachePruneInterval,
1802 PruneAfter: getHeaderSearchOpts().ModuleCachePruneAfter);
1803
1804 HeaderSearchOptions &HSOpts = getHeaderSearchOpts();
1805 std::string Sysroot = HSOpts.Sysroot;
1806 const PreprocessorOptions &PPOpts = getPreprocessorOpts();
1807 const FrontendOptions &FEOpts = getFrontendOpts();
1808 std::unique_ptr<llvm::Timer> ReadTimer;
1809
1810 if (timerGroup)
1811 ReadTimer = std::make_unique<llvm::Timer>(args: "reading_modules",
1812 args: "Reading modules", args&: *timerGroup);
1813 TheASTReader = llvm::makeIntrusiveRefCnt<ASTReader>(
1814 A&: getPreprocessor(), A&: getModuleCache(), A: &getASTContext(),
1815 A: getPCHContainerReader(), A&: getCodeGenOpts(),
1816 A&: getFrontendOpts().ModuleFileExtensions,
1817 A: Sysroot.empty() ? "" : Sysroot.c_str(),
1818 A: PPOpts.DisablePCHOrModuleValidation,
1819 /*AllowASTWithCompilerErrors=*/A: FEOpts.AllowPCMWithCompilerErrors,
1820 /*AllowConfigurationMismatch=*/A: false,
1821 A: +HSOpts.ModulesValidateSystemHeaders,
1822 A: +HSOpts.ModulesForceValidateUserHeaders,
1823 A: +HSOpts.ValidateASTInputFilesContent,
1824 A: +getFrontendOpts().UseGlobalModuleIndex, A: std::move(ReadTimer));
1825 if (hasASTConsumer()) {
1826 TheASTReader->setDeserializationListener(
1827 Listener: getASTConsumer().GetASTDeserializationListener());
1828 getASTContext().setASTMutationListener(
1829 getASTConsumer().GetASTMutationListener());
1830 }
1831 getASTContext().setExternalSource(TheASTReader);
1832 if (hasSema())
1833 TheASTReader->InitializeSema(S&: getSema());
1834 if (hasASTConsumer())
1835 TheASTReader->StartTranslationUnit(Consumer: &getASTConsumer());
1836
1837 for (auto &Listener : DependencyCollectors)
1838 Listener->attachToASTReader(R&: *TheASTReader);
1839}
1840
1841bool CompilerInstance::loadModuleFile(
1842 ModuleFileName FileName, serialization::ModuleFile *&LoadedModuleFile) {
1843 llvm::Timer Timer;
1844 if (timerGroup)
1845 Timer.init(TimerName: "preloading." + std::string(FileName.str()),
1846 TimerDescription: "Preloading " + std::string(FileName.str()), tg&: *timerGroup);
1847 llvm::TimeRegion TimeLoading(timerGroup ? &Timer : nullptr);
1848
1849 // If we don't already have an ASTReader, create one now.
1850 if (!TheASTReader)
1851 createASTReader();
1852
1853 // If -Wmodule-file-config-mismatch is mapped as an error or worse, allow the
1854 // ASTReader to diagnose it, since it can produce better errors that we can.
1855 bool ConfigMismatchIsRecoverable =
1856 getDiagnostics().getDiagnosticLevel(DiagID: diag::warn_ast_file_config_mismatch,
1857 Loc: SourceLocation()) <=
1858 DiagnosticsEngine::Warning;
1859
1860 auto Listener = std::make_unique<ReadModuleNames>(args&: *PP);
1861 auto &ListenerRef = *Listener;
1862 ASTReader::ListenerScope ReadModuleNamesListener(*TheASTReader,
1863 std::move(Listener));
1864
1865 // Try to load the module file.
1866 switch (TheASTReader->ReadAST(
1867 FileName, Type: serialization::MK_ExplicitModule, ImportLoc: SourceLocation(),
1868 ClientLoadCapabilities: ConfigMismatchIsRecoverable ? ASTReader::ARR_ConfigurationMismatch : 0,
1869 NewLoadedModuleFile: &LoadedModuleFile)) {
1870 case ASTReader::Success:
1871 // We successfully loaded the module file; remember the set of provided
1872 // modules so that we don't try to load implicit modules for them.
1873 ListenerRef.registerAll();
1874 return true;
1875
1876 case ASTReader::ConfigurationMismatch:
1877 // Ignore unusable module files.
1878 getDiagnostics().Report(Loc: SourceLocation(),
1879 DiagID: diag::warn_ast_file_config_mismatch)
1880 << FileName;
1881 // All modules provided by any files we tried and failed to load are now
1882 // unavailable; includes of those modules should now be handled textually.
1883 ListenerRef.markAllUnavailable();
1884 return true;
1885
1886 default:
1887 return false;
1888 }
1889}
1890
1891namespace {
1892enum ModuleSource {
1893 MS_ModuleNotFound,
1894 MS_ModuleCache,
1895 MS_PrebuiltModulePath,
1896 MS_ModuleBuildPragma
1897};
1898} // end namespace
1899
1900/// Select a source for loading the named module and compute the filename to
1901/// load it from.
1902static ModuleSource selectModuleSource(
1903 Module *M, StringRef ModuleName, ModuleFileName &ModuleFilename,
1904 const std::map<std::string, std::string, std::less<>> &BuiltModules,
1905 HeaderSearch &HS) {
1906 assert(ModuleFilename.empty() && "Already has a module source?");
1907
1908 // Check to see if the module has been built as part of this compilation
1909 // via a module build pragma.
1910 auto BuiltModuleIt = BuiltModules.find(x: ModuleName);
1911 if (BuiltModuleIt != BuiltModules.end()) {
1912 ModuleFilename = ModuleFileName::makeExplicit(Name: BuiltModuleIt->second);
1913 return MS_ModuleBuildPragma;
1914 }
1915
1916 // Try to load the module from the prebuilt module path.
1917 const HeaderSearchOptions &HSOpts = HS.getHeaderSearchOpts();
1918 if (!HSOpts.PrebuiltModuleFiles.empty() ||
1919 !HSOpts.PrebuiltModulePaths.empty()) {
1920 ModuleFilename = HS.getPrebuiltModuleFileName(ModuleName);
1921 if (HSOpts.EnablePrebuiltImplicitModules && ModuleFilename.empty())
1922 ModuleFilename = HS.getPrebuiltImplicitModuleFileName(Module: M);
1923 if (!ModuleFilename.empty())
1924 return MS_PrebuiltModulePath;
1925 }
1926
1927 // Try to load the module from the module cache.
1928 if (M) {
1929 ModuleFilename = HS.getCachedModuleFileName(Module: M);
1930 return MS_ModuleCache;
1931 }
1932
1933 return MS_ModuleNotFound;
1934}
1935
1936ModuleLoadResult CompilerInstance::findOrCompileModuleAndReadAST(
1937 StringRef ModuleName, SourceLocation ImportLoc, SourceRange ModuleNameRange,
1938 bool IsInclusionDirective) {
1939 // Search for a module with the given name.
1940 HeaderSearch &HS = PP->getHeaderSearchInfo();
1941 Module *M =
1942 HS.lookupModule(ModuleName, ImportLoc, AllowSearch: true, AllowExtraModuleMapSearch: !IsInclusionDirective);
1943
1944 // Check for any configuration macros that have changed. This is done
1945 // immediately before potentially building a module in case this module
1946 // depends on having one of its configuration macros defined to successfully
1947 // build. If this is not done the user will never see the warning.
1948 if (M)
1949 checkConfigMacros(PP&: getPreprocessor(), M, ImportLoc);
1950
1951 // Select the source and filename for loading the named module.
1952 ModuleFileName ModuleFilename;
1953 ModuleSource Source =
1954 selectModuleSource(M, ModuleName, ModuleFilename, BuiltModules, HS);
1955 SourceLocation ModuleNameLoc = ModuleNameRange.getBegin();
1956 if (Source == MS_ModuleNotFound) {
1957 // We can't find a module, error out here.
1958 getDiagnostics().Report(Loc: ModuleNameLoc, DiagID: diag::err_module_not_found)
1959 << ModuleName << ModuleNameRange;
1960 return nullptr;
1961 }
1962 if (ModuleFilename.empty()) {
1963 if (M && M->HasIncompatibleModuleFile) {
1964 // We tried and failed to load a module file for this module. Fall
1965 // back to textual inclusion for its headers.
1966 return ModuleLoadResult::ConfigMismatch;
1967 }
1968
1969 getDiagnostics().Report(Loc: ModuleNameLoc, DiagID: diag::err_module_build_disabled)
1970 << ModuleName;
1971 return nullptr;
1972 }
1973
1974 // Create an ASTReader on demand.
1975 if (!getASTReader())
1976 createASTReader();
1977
1978 // Time how long it takes to load the module.
1979 llvm::Timer Timer;
1980 if (timerGroup)
1981 Timer.init(TimerName: "loading." + std::string(ModuleFilename.str()),
1982 TimerDescription: "Loading " + std::string(ModuleFilename.str()), tg&: *timerGroup);
1983 llvm::TimeRegion TimeLoading(timerGroup ? &Timer : nullptr);
1984 llvm::TimeTraceScope TimeScope("Module Load", ModuleName);
1985
1986 // Try to load the module file. If we are not trying to load from the
1987 // module cache, we don't know how to rebuild modules.
1988 unsigned ARRFlags = Source == MS_ModuleCache
1989 ? ASTReader::ARR_OutOfDate | ASTReader::ARR_Missing |
1990 ASTReader::ARR_TreatModuleWithErrorsAsOutOfDate
1991 : Source == MS_PrebuiltModulePath
1992 ? 0
1993 : ASTReader::ARR_ConfigurationMismatch;
1994 switch (getASTReader()->ReadAST(FileName: ModuleFilename,
1995 Type: Source == MS_PrebuiltModulePath
1996 ? serialization::MK_PrebuiltModule
1997 : Source == MS_ModuleBuildPragma
1998 ? serialization::MK_ExplicitModule
1999 : serialization::MK_ImplicitModule,
2000 ImportLoc, ClientLoadCapabilities: ARRFlags)) {
2001 case ASTReader::Success: {
2002 if (M)
2003 return M;
2004 assert(Source != MS_ModuleCache &&
2005 "missing module, but file loaded from cache");
2006
2007 // A prebuilt module is indexed as a ModuleFile; the Module does not exist
2008 // until the first call to ReadAST. Look it up now.
2009 M = HS.lookupModule(ModuleName, ImportLoc, AllowSearch: true, AllowExtraModuleMapSearch: !IsInclusionDirective);
2010
2011 // Check whether M refers to the file in the prebuilt module path.
2012 if (M && M->getASTFileKey() &&
2013 *M->getASTFileKey() ==
2014 getASTReader()->getModuleManager().makeKey(Name: ModuleFilename))
2015 return M;
2016
2017 getDiagnostics().Report(Loc: ModuleNameLoc, DiagID: diag::err_module_prebuilt)
2018 << ModuleName;
2019 return ModuleLoadResult();
2020 }
2021
2022 case ASTReader::OutOfDate:
2023 case ASTReader::Missing:
2024 // The most interesting case.
2025 break;
2026
2027 case ASTReader::ConfigurationMismatch:
2028 if (Source == MS_PrebuiltModulePath)
2029 // FIXME: We shouldn't be setting HadFatalFailure below if we only
2030 // produce a warning here!
2031 getDiagnostics().Report(Loc: SourceLocation(),
2032 DiagID: diag::warn_ast_file_config_mismatch)
2033 << ModuleFilename;
2034 // Fall through to error out.
2035 [[fallthrough]];
2036 case ASTReader::VersionMismatch:
2037 case ASTReader::HadErrors:
2038 ModuleLoader::HadFatalFailure = true;
2039 // FIXME: The ASTReader will already have complained, but can we shoehorn
2040 // that diagnostic information into a more useful form?
2041 return ModuleLoadResult();
2042
2043 case ASTReader::Failure:
2044 ModuleLoader::HadFatalFailure = true;
2045 return ModuleLoadResult();
2046 }
2047
2048 // ReadAST returned Missing or OutOfDate.
2049 if (Source != MS_ModuleCache) {
2050 // We don't know the desired configuration for this module and don't
2051 // necessarily even have a module map. Since ReadAST already produces
2052 // diagnostics for these two cases, we simply error out here.
2053 return ModuleLoadResult();
2054 }
2055
2056 // The module file is missing or out-of-date. Build it.
2057 assert(M && "missing module, but trying to compile for cache");
2058
2059 // Check whether there is a cycle in the module graph.
2060 ModuleBuildStack ModPath = getSourceManager().getModuleBuildStack();
2061 ModuleBuildStack::iterator Pos = ModPath.begin(), PosEnd = ModPath.end();
2062 for (; Pos != PosEnd; ++Pos) {
2063 if (Pos->first == ModuleName)
2064 break;
2065 }
2066
2067 if (Pos != PosEnd) {
2068 SmallString<256> CyclePath;
2069 for (; Pos != PosEnd; ++Pos) {
2070 CyclePath += Pos->first;
2071 CyclePath += " -> ";
2072 }
2073 CyclePath += ModuleName;
2074
2075 getDiagnostics().Report(Loc: ModuleNameLoc, DiagID: diag::err_module_cycle)
2076 << ModuleName << CyclePath;
2077 return nullptr;
2078 }
2079
2080 // Check whether we have already attempted to build this module (but failed).
2081 if (FailedModules.contains(key: ModuleName)) {
2082 getDiagnostics().Report(Loc: ModuleNameLoc, DiagID: diag::err_module_not_built)
2083 << ModuleName << SourceRange(ImportLoc, ModuleNameLoc);
2084 return nullptr;
2085 }
2086
2087 // Try to compile and then read the AST.
2088 if (!compileModuleAndReadAST(ImportingInstance&: *this, ImportLoc, ModuleNameLoc, Module: M,
2089 ModuleFileName: ModuleFilename)) {
2090 assert(getDiagnostics().hasErrorOccurred() &&
2091 "undiagnosed error in compileModuleAndReadAST");
2092 FailedModules.insert(key: ModuleName);
2093 return nullptr;
2094 }
2095
2096 // Okay, we've rebuilt and now loaded the module.
2097 return M;
2098}
2099
2100ModuleLoadResult
2101CompilerInstance::loadModule(SourceLocation ImportLoc,
2102 ModuleIdPath Path,
2103 Module::NameVisibilityKind Visibility,
2104 bool IsInclusionDirective) {
2105 // Determine what file we're searching from.
2106 StringRef ModuleName = Path[0].getIdentifierInfo()->getName();
2107 SourceLocation ModuleNameLoc = Path[0].getLoc();
2108
2109 // If we've already handled this import, just return the cached result.
2110 // This cache eliminates redundant diagnostics when both the preprocessor
2111 // and parser see the same import declaration.
2112 if (ImportLoc.isValid()) {
2113 auto CacheIt = ModuleImportResults.find(Val: ImportLoc);
2114 if (CacheIt != ModuleImportResults.end()) {
2115 if (CacheIt->second && ModuleName != getLangOpts().CurrentModule)
2116 TheASTReader->makeModuleVisible(Mod: CacheIt->second, NameVisibility: Visibility, ImportLoc);
2117 return CacheIt->second;
2118 }
2119 }
2120
2121 // If we don't already have information on this module, load the module now.
2122 Module *Module = nullptr;
2123 ModuleMap &MM = getPreprocessor().getHeaderSearchInfo().getModuleMap();
2124 if (auto MaybeModule = MM.getCachedModuleLoad(II: *Path[0].getIdentifierInfo())) {
2125 // Use the cached result, which may be nullptr.
2126 Module = *MaybeModule;
2127 // Config macros are already checked before building a module, but they need
2128 // to be checked at each import location in case any of the config macros
2129 // have a new value at the current `ImportLoc`.
2130 if (Module)
2131 checkConfigMacros(PP&: getPreprocessor(), M: Module, ImportLoc);
2132 } else if (ModuleName == getLangOpts().CurrentModule) {
2133 // This is the module we're building.
2134 Module = PP->getHeaderSearchInfo().lookupModule(
2135 ModuleName, ImportLoc, /*AllowSearch*/ true,
2136 /*AllowExtraModuleMapSearch*/ !IsInclusionDirective);
2137
2138 // Config macros do not need to be checked here for two reasons.
2139 // * This will always be textual inclusion, and thus the config macros
2140 // actually do impact the content of the header.
2141 // * `Preprocessor::HandleHeaderIncludeOrImport` will never call this
2142 // function as the `#include` or `#import` is textual.
2143
2144 MM.cacheModuleLoad(II: *Path[0].getIdentifierInfo(), M: Module);
2145 } else if (getPreprocessorOpts().SingleModuleParseMode) {
2146 // This mimics how findOrCompileModuleAndReadAST() finds the module.
2147 Module = getPreprocessor().getHeaderSearchInfo().lookupModule(
2148 ModuleName, ImportLoc, AllowSearch: true, AllowExtraModuleMapSearch: !IsInclusionDirective);
2149 if (Module) {
2150 if (PPCallbacks *PPCb = getPreprocessor().getPPCallbacks())
2151 PPCb->moduleLoadSkipped(Skipped: Module);
2152 // Mark the module and its submodules as if they were loaded from a PCM.
2153 // This prevents emission of the "missing submodule" diagnostic below.
2154 std::vector<clang::Module *> Worklist{Module};
2155 while (!Worklist.empty()) {
2156 clang::Module *M = Worklist.back();
2157 Worklist.pop_back();
2158 M->IsFromModuleFile = true;
2159 for (clang::Module *SubM : M->submodules())
2160 Worklist.push_back(x: SubM);
2161 }
2162 }
2163 MM.cacheModuleLoad(II: *Path[0].getIdentifierInfo(), M: Module);
2164 } else {
2165 SourceLocation ModuleNameEndLoc = Path.back().getLoc().getLocWithOffset(
2166 Offset: Path.back().getIdentifierInfo()->getLength());
2167 ModuleLoadResult Result = findOrCompileModuleAndReadAST(
2168 ModuleName, ImportLoc, ModuleNameRange: SourceRange{ModuleNameLoc, ModuleNameEndLoc},
2169 IsInclusionDirective);
2170 if (!Result.isNormal())
2171 return Result;
2172 if (!Result)
2173 DisableGeneratingGlobalModuleIndex = true;
2174 Module = Result;
2175 MM.cacheModuleLoad(II: *Path[0].getIdentifierInfo(), M: Module);
2176 }
2177
2178 // If we never found the module, fail. Otherwise, verify the module and link
2179 // it up.
2180 if (!Module)
2181 return ModuleLoadResult();
2182
2183 // Verify that the rest of the module path actually corresponds to
2184 // a submodule.
2185 bool MapPrivateSubModToTopLevel = false;
2186 for (unsigned I = 1, N = Path.size(); I != N; ++I) {
2187 StringRef Name = Path[I].getIdentifierInfo()->getName();
2188 clang::Module *Sub = Module->findSubmodule(Name);
2189
2190 // If the user is requesting Foo.Private and it doesn't exist, try to
2191 // match Foo_Private and emit a warning asking for the user to write
2192 // @import Foo_Private instead. FIXME: remove this when existing clients
2193 // migrate off of Foo.Private syntax.
2194 if (!Sub && Name == "Private" && Module == Module->getTopLevelModule()) {
2195 SmallString<128> PrivateModule(Module->Name);
2196 PrivateModule.append(RHS: "_Private");
2197
2198 SmallVector<IdentifierLoc, 2> PrivPath;
2199 auto &II = PP->getIdentifierTable().get(
2200 Name: PrivateModule, TokenCode: PP->getIdentifierInfo(Name: Module->Name)->getTokenID());
2201 PrivPath.emplace_back(Args: Path[0].getLoc(), Args: &II);
2202
2203 ModuleFileName FileName;
2204 // If there is a modulemap module or prebuilt module, load it.
2205 if (PP->getHeaderSearchInfo().lookupModule(ModuleName: PrivateModule, ImportLoc, AllowSearch: true,
2206 AllowExtraModuleMapSearch: !IsInclusionDirective) ||
2207 selectModuleSource(M: nullptr, ModuleName: PrivateModule, ModuleFilename&: FileName, BuiltModules,
2208 HS&: PP->getHeaderSearchInfo()) != MS_ModuleNotFound)
2209 Sub = loadModule(ImportLoc, Path: PrivPath, Visibility, IsInclusionDirective);
2210 if (Sub) {
2211 MapPrivateSubModToTopLevel = true;
2212 PP->markClangModuleAsAffecting(M: Module);
2213 if (!getDiagnostics().isIgnored(
2214 DiagID: diag::warn_no_priv_submodule_use_toplevel, Loc: ImportLoc)) {
2215 getDiagnostics().Report(Loc: Path[I].getLoc(),
2216 DiagID: diag::warn_no_priv_submodule_use_toplevel)
2217 << Path[I].getIdentifierInfo() << Module->getFullModuleName()
2218 << PrivateModule
2219 << SourceRange(Path[0].getLoc(), Path[I].getLoc())
2220 << FixItHint::CreateReplacement(RemoveRange: SourceRange(Path[0].getLoc()),
2221 Code: PrivateModule);
2222 getDiagnostics().Report(Loc: Sub->DefinitionLoc,
2223 DiagID: diag::note_private_top_level_defined);
2224 }
2225 }
2226 }
2227
2228 if (!Sub) {
2229 // Attempt to perform typo correction to find a module name that works.
2230 SmallVector<StringRef, 2> Best;
2231 unsigned BestEditDistance = (std::numeric_limits<unsigned>::max)();
2232
2233 for (class Module *SubModule : Module->submodules()) {
2234 unsigned ED =
2235 Name.edit_distance(Other: SubModule->Name,
2236 /*AllowReplacements=*/true, MaxEditDistance: BestEditDistance);
2237 if (ED <= BestEditDistance) {
2238 if (ED < BestEditDistance) {
2239 Best.clear();
2240 BestEditDistance = ED;
2241 }
2242
2243 Best.push_back(Elt: SubModule->Name);
2244 }
2245 }
2246
2247 // If there was a clear winner, user it.
2248 if (Best.size() == 1) {
2249 getDiagnostics().Report(Loc: Path[I].getLoc(),
2250 DiagID: diag::err_no_submodule_suggest)
2251 << Path[I].getIdentifierInfo() << Module->getFullModuleName()
2252 << Best[0] << SourceRange(Path[0].getLoc(), Path[I - 1].getLoc())
2253 << FixItHint::CreateReplacement(RemoveRange: SourceRange(Path[I].getLoc()),
2254 Code: Best[0]);
2255
2256 Sub = Module->findSubmodule(Name: Best[0]);
2257 }
2258 }
2259
2260 if (!Sub) {
2261 // No submodule by this name. Complain, and don't look for further
2262 // submodules.
2263 getDiagnostics().Report(Loc: Path[I].getLoc(), DiagID: diag::err_no_submodule)
2264 << Path[I].getIdentifierInfo() << Module->getFullModuleName()
2265 << SourceRange(Path[0].getLoc(), Path[I - 1].getLoc());
2266 break;
2267 }
2268
2269 Module = Sub;
2270 }
2271
2272 // Make the named module visible, if it's not already part of the module
2273 // we are parsing.
2274 if (ModuleName != getLangOpts().CurrentModule) {
2275 if (!Module->IsFromModuleFile && !MapPrivateSubModToTopLevel) {
2276 // We have an umbrella header or directory that doesn't actually include
2277 // all of the headers within the directory it covers. Complain about
2278 // this missing submodule and recover by forgetting that we ever saw
2279 // this submodule.
2280 // FIXME: Should we detect this at module load time? It seems fairly
2281 // expensive (and rare).
2282 getDiagnostics().Report(Loc: ImportLoc, DiagID: diag::warn_missing_submodule)
2283 << Module->getFullModuleName()
2284 << SourceRange(Path.front().getLoc(), Path.back().getLoc());
2285
2286 return ModuleLoadResult(Module, ModuleLoadResult::MissingExpected);
2287 }
2288
2289 // Check whether this module is available.
2290 if (Preprocessor::checkModuleIsAvailable(LangOpts: getLangOpts(), TargetInfo: getTarget(),
2291 M: *Module, Diags&: getDiagnostics())) {
2292 getDiagnostics().Report(Loc: ImportLoc, DiagID: diag::note_module_import_here)
2293 << SourceRange(Path.front().getLoc(), Path.back().getLoc());
2294 ModuleImportResults[ImportLoc] = ModuleLoadResult();
2295 return ModuleLoadResult();
2296 }
2297
2298 TheASTReader->makeModuleVisible(Mod: Module, NameVisibility: Visibility, ImportLoc);
2299 }
2300
2301 // Resolve any remaining module using export_as for this one.
2302 getPreprocessor()
2303 .getHeaderSearchInfo()
2304 .getModuleMap()
2305 .resolveLinkAsDependencies(Mod: Module->getTopLevelModule());
2306
2307 ModuleImportResults[ImportLoc] = ModuleLoadResult(Module);
2308 return ModuleLoadResult(Module);
2309}
2310
2311void CompilerInstance::createModuleFromSource(SourceLocation ImportLoc,
2312 StringRef ModuleName,
2313 StringRef Source) {
2314 // Avoid creating filenames with special characters.
2315 SmallString<128> CleanModuleName(ModuleName);
2316 for (auto &C : CleanModuleName)
2317 if (!isAlphanumeric(c: C))
2318 C = '_';
2319
2320 // FIXME: Using a randomized filename here means that our intermediate .pcm
2321 // output is nondeterministic (as .pcm files refer to each other by name).
2322 // Can this affect the output in any way?
2323 SmallString<128> ModuleFileName;
2324 int FD;
2325 if (std::error_code EC = llvm::sys::fs::createTemporaryFile(
2326 Prefix: CleanModuleName, Suffix: "pcm", ResultFD&: FD, ResultPath&: ModuleFileName)) {
2327 getDiagnostics().Report(Loc: ImportLoc, DiagID: diag::err_fe_unable_to_open_output)
2328 << ModuleFileName << EC.message();
2329 return;
2330 }
2331 std::string ModuleMapFileName = (CleanModuleName + ".map").str();
2332
2333 FrontendInputFile Input(
2334 ModuleMapFileName,
2335 InputKind(getLanguageFromOptions(LangOpts: Invocation->getLangOpts()),
2336 InputKind::ModuleMap, /*Preprocessed*/true));
2337
2338 std::string NullTerminatedSource(Source.str());
2339
2340 auto Other = cloneForModuleCompileImpl(ImportLoc, ModuleName, Input,
2341 OriginalModuleMapFile: StringRef(), ModuleFileName);
2342
2343 // Create a virtual file containing our desired source.
2344 // FIXME: We shouldn't need to do this.
2345 FileEntryRef ModuleMapFile = Other->getFileManager().getVirtualFileRef(
2346 Filename: ModuleMapFileName, Size: NullTerminatedSource.size(), ModificationTime: 0);
2347 Other->getSourceManager().overrideFileContents(
2348 SourceFile: ModuleMapFile, Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: NullTerminatedSource));
2349
2350 Other->BuiltModules = std::move(BuiltModules);
2351 Other->DeleteBuiltModules = false;
2352
2353 // Build the module, inheriting any modules that we've built locally.
2354 std::unique_ptr<llvm::MemoryBuffer> Buffer =
2355 compileModule(ImportLoc, ModuleName, ModuleFileName, Instance&: *Other);
2356 BuiltModules = std::move(Other->BuiltModules);
2357
2358 if (Buffer) {
2359 llvm::raw_fd_ostream OS(FD, /*shouldClose=*/true);
2360 BuiltModules[std::string(ModuleName)] = std::string(ModuleFileName);
2361 OS << Buffer->getBuffer();
2362 llvm::sys::RemoveFileOnSignal(Filename: ModuleFileName);
2363 }
2364}
2365
2366void CompilerInstance::makeModuleVisible(Module *Mod,
2367 Module::NameVisibilityKind Visibility,
2368 SourceLocation ImportLoc) {
2369 if (!TheASTReader)
2370 createASTReader();
2371 if (!TheASTReader)
2372 return;
2373
2374 TheASTReader->makeModuleVisible(Mod, NameVisibility: Visibility, ImportLoc);
2375}
2376
2377GlobalModuleIndex *CompilerInstance::loadGlobalModuleIndex(
2378 SourceLocation TriggerLoc) {
2379 if (getPreprocessor()
2380 .getHeaderSearchInfo()
2381 .getSpecificModuleCachePath()
2382 .empty())
2383 return nullptr;
2384 if (!TheASTReader)
2385 createASTReader();
2386 // Can't do anything if we don't have the module manager.
2387 if (!TheASTReader)
2388 return nullptr;
2389 // Get an existing global index. This loads it if not already
2390 // loaded.
2391 TheASTReader->loadGlobalIndex();
2392 GlobalModuleIndex *GlobalIndex = TheASTReader->getGlobalIndex();
2393 // If the global index doesn't exist, create it.
2394 if (!GlobalIndex && shouldBuildGlobalModuleIndex() && hasFileManager() &&
2395 hasPreprocessor()) {
2396 llvm::sys::fs::create_directories(
2397 path: getPreprocessor().getHeaderSearchInfo().getSpecificModuleCachePath());
2398 if (llvm::Error Err = GlobalModuleIndex::writeIndex(
2399 FileMgr&: getFileManager(), PCHContainerRdr: getPCHContainerReader(),
2400 Path: getPreprocessor()
2401 .getHeaderSearchInfo()
2402 .getSpecificModuleCachePath())) {
2403 // FIXME this drops the error on the floor. This code is only used for
2404 // typo correction and drops more than just this one source of errors
2405 // (such as the directory creation failure above). It should handle the
2406 // error.
2407 consumeError(Err: std::move(Err));
2408 return nullptr;
2409 }
2410 TheASTReader->resetForReload();
2411 TheASTReader->loadGlobalIndex();
2412 GlobalIndex = TheASTReader->getGlobalIndex();
2413 }
2414 // For finding modules needing to be imported for fixit messages,
2415 // we need to make the global index cover all modules, so we do that here.
2416 if (!HaveFullGlobalModuleIndex && GlobalIndex && !buildingModule()) {
2417 ModuleMap &MMap = getPreprocessor().getHeaderSearchInfo().getModuleMap();
2418
2419 // Load modules that were parsed from module maps but not loaded yet.
2420 MMap.loadAllParsedModules();
2421
2422 bool RecreateIndex = false;
2423 for (ModuleMap::module_iterator I = MMap.module_begin(),
2424 E = MMap.module_end(); I != E; ++I) {
2425 Module *TheModule = I->second;
2426 if (!TheModule->getASTFileKey()) {
2427 SmallVector<IdentifierLoc, 2> Path;
2428 Path.emplace_back(Args&: TriggerLoc,
2429 Args: getPreprocessor().getIdentifierInfo(Name: TheModule->Name));
2430 std::reverse(first: Path.begin(), last: Path.end());
2431 // Load a module as hidden. This also adds it to the global index.
2432 loadModule(ImportLoc: TheModule->DefinitionLoc, Path, Visibility: Module::Hidden, IsInclusionDirective: false);
2433 RecreateIndex = true;
2434 }
2435 }
2436 if (RecreateIndex) {
2437 if (llvm::Error Err = GlobalModuleIndex::writeIndex(
2438 FileMgr&: getFileManager(), PCHContainerRdr: getPCHContainerReader(),
2439 Path: getPreprocessor()
2440 .getHeaderSearchInfo()
2441 .getSpecificModuleCachePath())) {
2442 // FIXME As above, this drops the error on the floor.
2443 consumeError(Err: std::move(Err));
2444 return nullptr;
2445 }
2446 TheASTReader->resetForReload();
2447 TheASTReader->loadGlobalIndex();
2448 GlobalIndex = TheASTReader->getGlobalIndex();
2449 }
2450 HaveFullGlobalModuleIndex = true;
2451 }
2452 return GlobalIndex;
2453}
2454
2455// Check global module index for missing imports.
2456bool
2457CompilerInstance::lookupMissingImports(StringRef Name,
2458 SourceLocation TriggerLoc) {
2459 // Look for the symbol in non-imported modules, but only if an error
2460 // actually occurred.
2461 if (!buildingModule()) {
2462 // Load global module index, or retrieve a previously loaded one.
2463 GlobalModuleIndex *GlobalIndex = loadGlobalModuleIndex(
2464 TriggerLoc);
2465
2466 // Only if we have a global index.
2467 if (GlobalIndex) {
2468 GlobalModuleIndex::HitSet FoundModules;
2469
2470 // Find the modules that reference the identifier.
2471 // Note that this only finds top-level modules.
2472 // We'll let diagnoseTypo find the actual declaration module.
2473 if (GlobalIndex->lookupIdentifier(Name, Hits&: FoundModules))
2474 return true;
2475 }
2476 }
2477
2478 return false;
2479}
2480void CompilerInstance::resetAndLeakSema() { llvm::BuryPointer(Ptr: takeSema()); }
2481
2482void CompilerInstance::setExternalSemaSource(
2483 IntrusiveRefCntPtr<ExternalSemaSource> ESS) {
2484 ExternalSemaSrc = std::move(ESS);
2485}
2486