clang 23.0.0git
CompilerInstance.cpp
Go to the documentation of this file.
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
12#include "clang/AST/Decl.h"
20#include "clang/Basic/Stack.h"
22#include "clang/Basic/Version.h"
23#include "clang/Config/config.h"
39#include "clang/Sema/Sema.h"
45#include "llvm/ADT/IntrusiveRefCntPtr.h"
46#include "llvm/ADT/STLExtras.h"
47#include "llvm/ADT/ScopeExit.h"
48#include "llvm/ADT/Statistic.h"
49#include "llvm/Config/llvm-config.h"
50#include "llvm/Plugins/PassPlugin.h"
51#include "llvm/Support/AdvisoryLock.h"
52#include "llvm/Support/BuryPointer.h"
53#include "llvm/Support/CrashRecoveryContext.h"
54#include "llvm/Support/Errc.h"
55#include "llvm/Support/FileSystem.h"
56#include "llvm/Support/MemoryBuffer.h"
57#include "llvm/Support/Path.h"
58#include "llvm/Support/Signals.h"
59#include "llvm/Support/TimeProfiler.h"
60#include "llvm/Support/Timer.h"
61#include "llvm/Support/VirtualFileSystem.h"
62#include "llvm/Support/VirtualOutputBackends.h"
63#include "llvm/Support/VirtualOutputError.h"
64#include "llvm/Support/raw_ostream.h"
65#include "llvm/TargetParser/Host.h"
66#include <optional>
67#include <time.h>
68#include <utility>
69
70using namespace clang;
71
72CompilerInstance::CompilerInstance(
73 std::shared_ptr<CompilerInvocation> Invocation,
74 std::shared_ptr<PCHContainerOperations> PCHContainerOps,
75 std::shared_ptr<ModuleCache> ModCache)
76 : ModuleLoader(/*BuildingModule=*/ModCache != nullptr),
77 Invocation(std::move(Invocation)),
78 ModCache(ModCache ? std::move(ModCache)
80 ThePCHContainerOperations(std::move(PCHContainerOps)) {
81 assert(this->Invocation && "Invocation must not be null");
82}
83
85 assert(OutputFiles.empty() && "Still output files in flight?");
86}
87
89 return (BuildGlobalModuleIndex ||
90 (TheASTReader && TheASTReader->isGlobalIndexUnavailable() &&
91 getFrontendOpts().GenerateGlobalModuleIndex)) &&
92 !DisableGeneratingGlobalModuleIndex;
93}
94
99
101 OwnedVerboseOutputStream.reset();
102 VerboseOutputStream = &Value;
103}
104
105void CompilerInstance::setVerboseOutputStream(std::unique_ptr<raw_ostream> Value) {
106 OwnedVerboseOutputStream.swap(Value);
107 VerboseOutputStream = OwnedVerboseOutputStream.get();
108}
109
112
114 // Create the target instance.
117 if (!hasTarget())
118 return false;
119
120 // Check whether AuxTarget exists, if not, then create TargetInfo for the
121 // other side of CUDA/OpenMP/SYCL compilation.
122 if (!getAuxTarget() &&
123 (getLangOpts().CUDA || getLangOpts().isTargetDevice()) &&
124 !getFrontendOpts().AuxTriple.empty()) {
125 auto &TO = AuxTargetOpts = std::make_unique<TargetOptions>();
126 TO->Triple = llvm::Triple::normalize(getFrontendOpts().AuxTriple);
127 if (getFrontendOpts().AuxTargetCPU)
128 TO->CPU = *getFrontendOpts().AuxTargetCPU;
129 if (getFrontendOpts().AuxTargetFeatures)
130 TO->FeaturesAsWritten = *getFrontendOpts().AuxTargetFeatures;
131 TO->HostTriple = getTarget().getTriple().str();
133 }
134
135 if (!getTarget().hasStrictFP() && !getLangOpts().ExpStrictFP) {
136 if (getLangOpts().RoundingMath) {
137 getDiagnostics().Report(diag::warn_fe_backend_unsupported_fp_rounding);
138 getLangOpts().RoundingMath = false;
139 }
140 auto FPExc = getLangOpts().getFPExceptionMode();
141 if (FPExc != LangOptions::FPE_Default && FPExc != LangOptions::FPE_Ignore) {
142 getDiagnostics().Report(diag::warn_fe_backend_unsupported_fp_exceptions);
143 getLangOpts().setFPExceptionMode(LangOptions::FPE_Ignore);
144 }
145 // FIXME: can we disable FEnvAccess?
146 }
147
148 // We should do it here because target knows nothing about
149 // language options when it's being created.
150 if (getLangOpts().OpenCL &&
151 !getTarget().validateOpenCLTarget(getLangOpts(), getDiagnostics()))
152 return false;
153
154 // Inform the target of the language options.
155 // FIXME: We shouldn't need to do this, the target should be immutable once
156 // created. This complexity should be lifted elsewhere.
158
159 if (auto *Aux = getAuxTarget())
160 getTarget().setAuxTarget(Aux);
161
162 return true;
163}
164
166 assert(Value == nullptr ||
167 getVirtualFileSystemPtr() == Value->getVirtualFileSystemPtr());
168 FileMgr = std::move(Value);
169}
170
175
176void CompilerInstance::setPreprocessor(std::shared_ptr<Preprocessor> Value) {
177 PP = std::move(Value);
178}
179
182 Context = std::move(Value);
183
184 if (Context && Consumer)
186}
187
189 TheSema.reset(S);
190}
191
192void CompilerInstance::setASTConsumer(std::unique_ptr<ASTConsumer> Value) {
193 Consumer = std::move(Value);
194
195 if (Context && Consumer)
197}
198
202
203std::unique_ptr<Sema> CompilerInstance::takeSema() {
204 return std::move(TheSema);
205}
206
208 return TheASTReader;
209}
211 assert(ModCache.get() == &Reader->getModuleManager().getModuleCache() &&
212 "Expected ASTReader to use the same PCM cache");
213 TheASTReader = std::move(Reader);
214}
215
216std::shared_ptr<ModuleDependencyCollector>
218 return ModuleDepCollector;
219}
220
222 std::shared_ptr<ModuleDependencyCollector> Collector) {
223 ModuleDepCollector = std::move(Collector);
224}
225
226static void collectHeaderMaps(const HeaderSearch &HS,
227 std::shared_ptr<ModuleDependencyCollector> MDC) {
228 SmallVector<std::string, 4> HeaderMapFileNames;
229 HS.getHeaderMapFileNames(HeaderMapFileNames);
230 for (auto &Name : HeaderMapFileNames)
231 MDC->addFile(Name);
232}
233
235 std::shared_ptr<ModuleDependencyCollector> MDC) {
236 const PreprocessorOptions &PPOpts = CI.getPreprocessorOpts();
237 if (PPOpts.ImplicitPCHInclude.empty())
238 return;
239
240 StringRef PCHInclude = PPOpts.ImplicitPCHInclude;
242 auto PCHDir = FileMgr.getOptionalDirectoryRef(PCHInclude);
243 if (!PCHDir) {
244 MDC->addFile(PCHInclude);
245 return;
246 }
247
248 std::error_code EC;
249 SmallString<128> DirNative;
250 llvm::sys::path::native(PCHDir->getName(), DirNative);
251 llvm::vfs::FileSystem &FS = FileMgr.getVirtualFileSystem();
253 for (llvm::vfs::directory_iterator Dir = FS.dir_begin(DirNative, EC), DirEnd;
254 Dir != DirEnd && !EC; Dir.increment(EC)) {
255 // Check whether this is an AST file. ASTReader::isAcceptableASTFile is not
256 // used here since we're not interested in validating the PCH at this time,
257 // but only to check whether this is a file containing an AST.
259 Dir->path(), FileMgr, CI.getModuleCache(),
261 /*FindModuleFileExtensions=*/false, Validator,
262 /*ValidateDiagnosticOptions=*/false))
263 MDC->addFile(Dir->path());
264 }
265}
266
268 std::shared_ptr<ModuleDependencyCollector> MDC) {
269 // Collect all VFS found.
271 CI.getVirtualFileSystem().visit([&](llvm::vfs::FileSystem &VFS) {
272 if (auto *RedirectingVFS = dyn_cast<llvm::vfs::RedirectingFileSystem>(&VFS))
273 llvm::vfs::collectVFSEntries(*RedirectingVFS, VFSEntries);
274 });
275
276 for (auto &E : VFSEntries)
277 MDC->addFile(E.VPath, E.RPath);
278}
279
282 DiagnosticOptions DiagOpts;
283 DiagnosticsEngine Diags(DiagnosticIDs::create(), DiagOpts, DC,
284 /*ShouldOwnClient=*/false);
285
287 std::move(BaseFS));
288 // FIXME: Should this go into createVFSFromCompilerInvocation?
289 if (getFrontendOpts().ShowStats)
290 VFS =
291 llvm::makeIntrusiveRefCnt<llvm::vfs::TracingFileSystem>(std::move(VFS));
292}
293
294// Diagnostics
296 const CodeGenOptions *CodeGenOpts,
297 DiagnosticsEngine &Diags) {
298 std::error_code EC;
299 std::unique_ptr<raw_ostream> StreamOwner;
300 raw_ostream *OS = &llvm::errs();
301 if (DiagOpts.DiagnosticLogFile != "-") {
302 // Create the output stream.
303 auto FileOS = std::make_unique<llvm::raw_fd_ostream>(
304 DiagOpts.DiagnosticLogFile, EC,
305 llvm::sys::fs::OF_Append | llvm::sys::fs::OF_TextWithCRLF);
306 if (EC) {
307 Diags.Report(diag::warn_fe_cc_log_diagnostics_failure)
308 << DiagOpts.DiagnosticLogFile << EC.message();
309 } else {
310 FileOS->SetUnbuffered();
311 OS = FileOS.get();
312 StreamOwner = std::move(FileOS);
313 }
314 }
315
316 // Chain in the diagnostic client which will log the diagnostics.
317 auto Logger = std::make_unique<LogDiagnosticPrinter>(*OS, DiagOpts,
318 std::move(StreamOwner));
319 if (CodeGenOpts)
320 Logger->setDwarfDebugFlags(CodeGenOpts->DwarfDebugFlags);
321 if (Diags.ownsClient()) {
322 Diags.setClient(
323 new ChainedDiagnosticConsumer(Diags.takeClient(), std::move(Logger)));
324 } else {
325 Diags.setClient(
326 new ChainedDiagnosticConsumer(Diags.getClient(), std::move(Logger)));
327 }
328}
329
331 DiagnosticsEngine &Diags,
332 StringRef OutputFile) {
333 auto SerializedConsumer =
334 clang::serialized_diags::create(OutputFile, DiagOpts);
335
336 if (Diags.ownsClient()) {
338 Diags.takeClient(), std::move(SerializedConsumer)));
339 } else {
341 Diags.getClient(), std::move(SerializedConsumer)));
342 }
343}
344
346 bool ShouldOwnClient) {
348 Client, ShouldOwnClient, &getCodeGenOpts());
349}
350
352 llvm::vfs::FileSystem &VFS, DiagnosticOptions &Opts,
353 DiagnosticConsumer *Client, bool ShouldOwnClient,
354 const CodeGenOptions *CodeGenOpts) {
355 auto Diags = llvm::makeIntrusiveRefCnt<DiagnosticsEngine>(
356 DiagnosticIDs::create(), Opts);
357
358 // Create the diagnostic client for reporting errors or for
359 // implementing -verify.
360 if (Client) {
361 Diags->setClient(Client, ShouldOwnClient);
362 } else if (Opts.getFormat() == DiagnosticOptions::SARIF) {
363 Diags->setClient(new SARIFDiagnosticPrinter(llvm::errs(), Opts));
364 } else
365 Diags->setClient(new TextDiagnosticPrinter(llvm::errs(), Opts));
366
367 // Chain in -verify checker, if requested.
368 if (Opts.VerifyDiagnostics)
369 Diags->setClient(new VerifyDiagnosticConsumer(*Diags));
370
371 // Chain in -diagnostic-log-file dumper, if requested.
372 if (!Opts.DiagnosticLogFile.empty())
373 SetUpDiagnosticLog(Opts, CodeGenOpts, *Diags);
374
375 if (!Opts.DiagnosticSerializationFile.empty())
377
378 // Configure our handling of diagnostics.
379 ProcessWarningOptions(*Diags, Opts, VFS);
380
381 return Diags;
382}
383
384// File Manager
385
387 assert(VFS && "CompilerInstance needs a VFS for creating FileManager");
388 FileMgr = llvm::makeIntrusiveRefCnt<FileManager>(getFileSystemOpts(), VFS);
389}
390
391// Source Manager
392
394 assert(Diagnostics && "DiagnosticsEngine needed for creating SourceManager");
395 assert(FileMgr && "FileManager needed for creating SourceManager");
396 SourceMgr = llvm::makeIntrusiveRefCnt<SourceManager>(getDiagnostics(),
398}
399
400// Initialize the remapping of files to alternative contents, e.g.,
401// those specified through other files.
403 SourceManager &SourceMgr,
405 const PreprocessorOptions &InitOpts) {
406 // Remap files in the source manager (with buffers).
407 for (const auto &RB : InitOpts.RemappedFileBuffers) {
408 // Create the file entry for the file that we're mapping from.
409 FileEntryRef FromFile =
410 FileMgr.getVirtualFileRef(RB.first, RB.second->getBufferSize(), 0);
411
412 // Override the contents of the "from" file with the contents of the
413 // "to" file. If the caller owns the buffers, then pass a MemoryBufferRef;
414 // otherwise, pass as a std::unique_ptr<MemoryBuffer> to transfer ownership
415 // to the SourceManager.
416 if (InitOpts.RetainRemappedFileBuffers)
417 SourceMgr.overrideFileContents(FromFile, RB.second->getMemBufferRef());
418 else
419 SourceMgr.overrideFileContents(
420 FromFile, std::unique_ptr<llvm::MemoryBuffer>(RB.second));
421 }
422
423 // Remap files in the source manager (with other files).
424 for (const auto &RF : InitOpts.RemappedFiles) {
425 // Find the file that we're mapping to.
426 OptionalFileEntryRef ToFile = FileMgr.getOptionalFileRef(RF.second);
427 if (!ToFile) {
428 Diags.Report(diag::err_fe_remap_missing_to_file) << RF.first << RF.second;
429 continue;
430 }
431
432 // Create the file entry for the file that we're mapping from.
433 FileEntryRef FromFile =
434 FileMgr.getVirtualFileRef(RF.first, ToFile->getSize(), 0);
435
436 // Override the contents of the "from" file with the contents of
437 // the "to" file.
438 SourceMgr.overrideFileContents(FromFile, *ToFile);
439 }
440
441 SourceMgr.setOverridenFilesKeepOriginalName(
443}
444
445// Preprocessor
446
449
450 // The AST reader holds a reference to the old preprocessor (if any).
451 TheASTReader.reset();
452
453 // Create the Preprocessor.
454 HeaderSearch *HeaderInfo =
457 PP = std::make_shared<Preprocessor>(Invocation->getPreprocessorOpts(),
459 getSourceManager(), *HeaderInfo, *this,
460 /*IdentifierInfoLookup=*/nullptr,
461 /*OwnsHeaderSearch=*/true, TUKind);
463 PP->Initialize(getTarget(), getAuxTarget());
464
465 if (PPOpts.DetailedRecord)
466 PP->createPreprocessingRecord();
467
468 // Apply remappings to the source manager.
469 InitializeFileRemapping(PP->getDiagnostics(), PP->getSourceManager(),
470 PP->getFileManager(), PPOpts);
471
472 // Predefine macros and configure the preprocessor.
475
476 // Initialize the header search object. In CUDA compilations, we use the aux
477 // triple (the host triple) to initialize our header search, since we need to
478 // find the host headers in order to compile the CUDA code.
479 const llvm::Triple *HeaderSearchTriple = &PP->getTargetInfo().getTriple();
480 if (PP->getTargetInfo().getTriple().getOS() == llvm::Triple::CUDA &&
481 PP->getAuxTargetInfo())
482 HeaderSearchTriple = &PP->getAuxTargetInfo()->getTriple();
483
484 ApplyHeaderSearchOptions(PP->getHeaderSearchInfo(), getHeaderSearchOpts(),
485 PP->getLangOpts(), *HeaderSearchTriple);
486
487 PP->setPreprocessedOutput(getPreprocessorOutputOpts().ShowCPP);
488
489 if (PP->getLangOpts().Modules && PP->getLangOpts().ImplicitModules) {
490 std::string ContextHash = getInvocation().computeContextHash();
491 PP->getHeaderSearchInfo().setContextHash(ContextHash);
492 PP->getHeaderSearchInfo().setSpecificModuleCachePath(
493 getSpecificModuleCachePath(ContextHash));
494 }
495
496 // Handle generating dependencies, if requested.
498 if (!DepOpts.OutputFile.empty())
499 addDependencyCollector(std::make_shared<DependencyFileGenerator>(DepOpts));
500 if (!DepOpts.DOTOutputFile.empty())
502 getHeaderSearchOpts().Sysroot);
503
504 // If we don't have a collector, but we are collecting module dependencies,
505 // then we're the top level compiler instance and need to create one.
506 if (!ModuleDepCollector && !DepOpts.ModuleDependencyOutputDir.empty()) {
507 ModuleDepCollector = std::make_shared<ModuleDependencyCollector>(
509 }
510
511 // If there is a module dep collector, register with other dep collectors
512 // and also (a) collect header maps and (b) TODO: input vfs overlay files.
513 if (ModuleDepCollector) {
514 addDependencyCollector(ModuleDepCollector);
515 collectHeaderMaps(PP->getHeaderSearchInfo(), ModuleDepCollector);
516 collectIncludePCH(*this, ModuleDepCollector);
517 collectVFSEntries(*this, ModuleDepCollector);
518 }
519
520 // Modules need an output manager.
521 if (!hasOutputManager())
523
524 for (auto &Listener : DependencyCollectors)
525 Listener->attachToPreprocessor(*PP);
526
527 // Handle generating header include information, if requested.
528 if (DepOpts.ShowHeaderIncludes)
529 AttachHeaderIncludeGen(*PP, DepOpts);
530 if (!DepOpts.HeaderIncludeOutputFile.empty()) {
531 StringRef OutputPath = DepOpts.HeaderIncludeOutputFile;
532 if (OutputPath == "-")
533 OutputPath = "";
534 AttachHeaderIncludeGen(*PP, DepOpts,
535 /*ShowAllHeaders=*/true, OutputPath,
536 /*ShowDepth=*/false);
537 }
538
540 AttachHeaderIncludeGen(*PP, DepOpts,
541 /*ShowAllHeaders=*/true, /*OutputPath=*/"",
542 /*ShowDepth=*/true, /*MSStyle=*/true);
543 }
544
545 if (GetDependencyDirectives)
546 PP->setDependencyDirectivesGetter(*GetDependencyDirectives);
547}
548
549std::string
551 assert(FileMgr && "Specific module cache path requires a FileManager");
552
553 // Set up the module path, including the hash for the module-creation options.
554 SmallString<256> SpecificModuleCache;
555 normalizeModuleCachePath(*FileMgr, getHeaderSearchOpts().ModuleCachePath,
556 SpecificModuleCache);
557 if (!SpecificModuleCache.empty() && !getHeaderSearchOpts().DisableModuleHash)
558 llvm::sys::path::append(SpecificModuleCache, ContextHash);
559 return std::string(SpecificModuleCache);
560}
561
562// ASTContext
563
566 auto Context = llvm::makeIntrusiveRefCnt<ASTContext>(
567 getLangOpts(), PP.getSourceManager(), PP.getIdentifierTable(),
568 PP.getSelectorTable(), PP.getBuiltinInfo(), PP.TUKind);
569 Context->InitBuiltinTypes(getTarget(), getAuxTarget());
570 setASTContext(std::move(Context));
571}
572
573// ExternalASTSource
574
575namespace {
576// Helper to recursively read the module names for all modules we're adding.
577// We mark these as known and redirect any attempt to load that module to
578// the files we were handed.
579struct ReadModuleNames : ASTReaderListener {
580 Preprocessor &PP;
582
583 ReadModuleNames(Preprocessor &PP) : PP(PP) {}
584
585 void ReadModuleName(StringRef ModuleName) override {
586 // Keep the module name as a string for now. It's not safe to create a new
587 // IdentifierInfo from an ASTReader callback.
588 LoadedModules.push_back(ModuleName.str());
589 }
590
591 void registerAll() {
592 ModuleMap &MM = PP.getHeaderSearchInfo().getModuleMap();
593 for (const std::string &LoadedModule : LoadedModules)
594 MM.cacheModuleLoad(*PP.getIdentifierInfo(LoadedModule),
595 MM.findOrLoadModule(LoadedModule));
596 LoadedModules.clear();
597 }
598
599 void markAllUnavailable() {
600 for (const std::string &LoadedModule : LoadedModules) {
602 LoadedModule)) {
603 M->HasIncompatibleModuleFile = true;
604
605 // Mark module as available if the only reason it was unavailable
606 // was missing headers.
607 SmallVector<Module *, 2> Stack;
608 Stack.push_back(M);
609 while (!Stack.empty()) {
610 Module *Current = Stack.pop_back_val();
611 if (Current->IsUnimportable) continue;
612 Current->IsAvailable = true;
613 auto SubmodulesRange = Current->submodules();
614 llvm::append_range(Stack, SubmodulesRange);
615 }
616 }
617 }
618 LoadedModules.clear();
619 }
620};
621} // namespace
622
624 StringRef Path, DisableValidationForModuleKind DisableValidation,
625 bool AllowPCHWithCompilerErrors, void *DeserializationListener,
626 bool OwnDeserializationListener) {
628 TheASTReader = createPCHExternalASTSource(
629 Path, getHeaderSearchOpts().Sysroot, DisableValidation,
630 AllowPCHWithCompilerErrors, getPreprocessor(), getModuleCache(),
632 getFrontendOpts().ModuleFileExtensions, DependencyCollectors,
633 DeserializationListener, OwnDeserializationListener, Preamble,
634 getFrontendOpts().UseGlobalModuleIndex);
635}
636
638 StringRef Path, StringRef Sysroot,
639 DisableValidationForModuleKind DisableValidation,
640 bool AllowPCHWithCompilerErrors, Preprocessor &PP, ModuleCache &ModCache,
641 ASTContext &Context, const PCHContainerReader &PCHContainerRdr,
642 const CodeGenOptions &CodeGenOpts,
643 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
644 ArrayRef<std::shared_ptr<DependencyCollector>> DependencyCollectors,
645 void *DeserializationListener, bool OwnDeserializationListener,
646 bool Preamble, bool UseGlobalModuleIndex) {
647 const HeaderSearchOptions &HSOpts =
648 PP.getHeaderSearchInfo().getHeaderSearchOpts();
649
650 auto Reader = llvm::makeIntrusiveRefCnt<ASTReader>(
651 PP, ModCache, &Context, PCHContainerRdr, CodeGenOpts, Extensions,
652 Sysroot.empty() ? "" : Sysroot.data(), DisableValidation,
653 AllowPCHWithCompilerErrors, /*AllowConfigurationMismatch*/ false,
656 HSOpts.ValidateASTInputFilesContent, UseGlobalModuleIndex);
657
658 // We need the external source to be set up before we read the AST, because
659 // eagerly-deserialized declarations may use it.
660 Context.setExternalSource(Reader);
661
662 Reader->setDeserializationListener(
663 static_cast<ASTDeserializationListener *>(DeserializationListener),
664 /*TakeOwnership=*/OwnDeserializationListener);
665
666 for (auto &Listener : DependencyCollectors)
667 Listener->attachToASTReader(*Reader);
668
669 auto Listener = std::make_unique<ReadModuleNames>(PP);
670 auto &ListenerRef = *Listener;
671 ASTReader::ListenerScope ReadModuleNamesListener(*Reader,
672 std::move(Listener));
673
674 switch (Reader->ReadAST(Path,
680 // Set the predefines buffer as suggested by the PCH reader. Typically, the
681 // predefines buffer will be empty.
682 PP.setPredefines(Reader->getSuggestedPredefines());
683 ListenerRef.registerAll();
684 return Reader;
685
687 // Unrecoverable failure: don't even try to process the input file.
688 break;
689
695 // No suitable PCH file could be found. Return an error.
696 break;
697 }
698
699 ListenerRef.markAllUnavailable();
700 Context.setExternalSource(nullptr);
701 return nullptr;
702}
703
704// Code Completion
705
707 StringRef Filename,
708 unsigned Line,
709 unsigned Column) {
710 // Tell the source manager to chop off the given file at a specific
711 // line and column.
712 auto Entry = PP.getFileManager().getOptionalFileRef(Filename);
713 if (!Entry) {
714 PP.getDiagnostics().Report(diag::err_fe_invalid_code_complete_file)
715 << Filename;
716 return true;
717 }
718
719 // Truncate the named file at the given line/column.
721 return false;
722}
723
726 if (!CompletionConsumer) {
728 getPreprocessor(), Loc.FileName, Loc.Line, Loc.Column,
729 getFrontendOpts().CodeCompleteOpts, llvm::outs()));
730 return;
732 Loc.Line, Loc.Column)) {
734 return;
735 }
736}
737
739 timerGroup.reset(new llvm::TimerGroup("clang", "Clang time report"));
740 FrontendTimer.reset(new llvm::Timer("frontend", "Front end", *timerGroup));
741}
742
745 StringRef Filename,
746 unsigned Line,
747 unsigned Column,
748 const CodeCompleteOptions &Opts,
749 raw_ostream &OS) {
750 if (EnableCodeCompletion(PP, Filename, Line, Column))
751 return nullptr;
752
753 // Set up the creation routine for code-completion.
754 return new PrintingCodeCompleteConsumer(Opts, OS);
755}
756
758 CodeCompleteConsumer *CompletionConsumer) {
759 TheSema.reset(new Sema(getPreprocessor(), getASTContext(), getASTConsumer(),
760 TUKind, CompletionConsumer));
761
762 // Set up API notes.
763 TheSema->APINotes.setSwiftVersion(getAPINotesOpts().SwiftVersion);
764
765 // Attach the external sema source if there is any.
766 if (ExternalSemaSrc) {
767 TheSema->addExternalSource(ExternalSemaSrc);
768 ExternalSemaSrc->InitializeSema(*TheSema);
769 }
770
771 // If we're building a module and are supposed to load API notes,
772 // notify the API notes manager.
773 if (auto *currentModule = getPreprocessor().getCurrentModule()) {
774 (void)TheSema->APINotes.loadCurrentModuleAPINotes(
775 currentModule, getLangOpts().APINotesModules,
776 getAPINotesOpts().ModuleSearchPaths);
777 }
778}
779
780// Output Files
781
783 // The ASTConsumer can own streams that write to the output files.
784 assert(!hasASTConsumer() && "ASTConsumer should be reset");
785 if (!EraseFiles) {
786 for (auto &O : OutputFiles)
787 llvm::handleAllErrors(
788 O.keep(),
789 [&](const llvm::vfs::TempFileOutputError &E) {
790 getDiagnostics().Report(diag::err_unable_to_rename_temp)
791 << E.getTempPath() << E.getOutputPath()
792 << E.convertToErrorCode().message();
793 },
794 [&](const llvm::vfs::OutputError &E) {
795 getDiagnostics().Report(diag::err_fe_unable_to_open_output)
796 << E.getOutputPath() << E.convertToErrorCode().message();
797 },
798 [&](const llvm::ErrorInfoBase &EIB) { // Handle any remaining error
799 getDiagnostics().Report(diag::err_fe_unable_to_open_output)
800 << O.getPath() << EIB.message();
801 });
802 }
803 OutputFiles.clear();
804 if (DeleteBuiltModules) {
805 for (auto &Module : BuiltModules)
806 llvm::sys::fs::remove(Module.second);
807 BuiltModules.clear();
808 }
809}
810
811std::unique_ptr<raw_pwrite_stream> CompilerInstance::createDefaultOutputFile(
812 bool Binary, StringRef InFile, StringRef Extension, bool RemoveFileOnSignal,
813 bool CreateMissingDirectories, bool ForceUseTemporary) {
814 StringRef OutputPath = getFrontendOpts().OutputFile;
815 std::optional<SmallString<128>> PathStorage;
816 if (OutputPath.empty()) {
817 if (InFile == "-" || Extension.empty()) {
818 OutputPath = "-";
819 } else {
820 PathStorage.emplace(InFile);
821 llvm::sys::path::replace_extension(*PathStorage, Extension);
822 OutputPath = *PathStorage;
823 }
824 }
825
826 return createOutputFile(OutputPath, Binary, RemoveFileOnSignal,
827 getFrontendOpts().UseTemporary || ForceUseTemporary,
828 CreateMissingDirectories);
829}
830
831std::unique_ptr<raw_pwrite_stream> CompilerInstance::createNullOutputFile() {
832 return std::make_unique<llvm::raw_null_ostream>();
833}
834
835// Output Manager
836
839 assert(!OutputMgr && "Already has an output manager");
840 OutputMgr = std::move(NewOutputs);
841}
842
844 assert(!OutputMgr && "Already has an output manager");
845 OutputMgr = llvm::makeIntrusiveRefCnt<llvm::vfs::OnDiskOutputBackend>();
846}
847
848llvm::vfs::OutputBackend &CompilerInstance::getOutputManager() {
849 assert(OutputMgr);
850 return *OutputMgr;
851}
852
854 if (!hasOutputManager())
856 return getOutputManager();
857}
858
859std::unique_ptr<raw_pwrite_stream>
861 bool RemoveFileOnSignal, bool UseTemporary,
862 bool CreateMissingDirectories) {
864 createOutputFileImpl(OutputPath, Binary, RemoveFileOnSignal, UseTemporary,
865 CreateMissingDirectories);
866 if (OS)
867 return std::move(*OS);
868 getDiagnostics().Report(diag::err_fe_unable_to_open_output)
869 << OutputPath << errorToErrorCode(OS.takeError()).message();
870 return nullptr;
871}
872
874CompilerInstance::createOutputFileImpl(StringRef OutputPath, bool Binary,
875 bool RemoveFileOnSignal,
876 bool UseTemporary,
877 bool CreateMissingDirectories) {
878 assert((!CreateMissingDirectories || UseTemporary) &&
879 "CreateMissingDirectories is only allowed when using temporary files");
880
881 // If '-working-directory' was passed, the output filename should be
882 // relative to that.
883 std::optional<SmallString<128>> AbsPath;
884 if (OutputPath != "-" && !llvm::sys::path::is_absolute(OutputPath)) {
885 assert(hasFileManager() &&
886 "File Manager is required to fix up relative path.\n");
887
888 AbsPath.emplace(OutputPath);
890 OutputPath = *AbsPath;
891 }
892
893 using namespace llvm::vfs;
895 OutputPath,
896 OutputConfig()
897 .setTextWithCRLF(!Binary)
898 .setDiscardOnSignal(RemoveFileOnSignal)
899 .setAtomicWrite(UseTemporary)
900 .setImplyCreateDirectories(UseTemporary && CreateMissingDirectories));
901 if (!O)
902 return O.takeError();
903
904 O->discardOnDestroy([](llvm::Error E) { consumeError(std::move(E)); });
905 OutputFiles.push_back(std::move(*O));
906 return OutputFiles.back().createProxy();
907}
908
909// Initialization Utilities
910
915
916// static
918 DiagnosticsEngine &Diags,
919 FileManager &FileMgr,
920 SourceManager &SourceMgr) {
926
927 if (Input.isBuffer()) {
928 SourceMgr.setMainFileID(SourceMgr.createFileID(Input.getBuffer(), Kind));
929 assert(SourceMgr.getMainFileID().isValid() &&
930 "Couldn't establish MainFileID!");
931 return true;
932 }
933
934 StringRef InputFile = Input.getFile();
935
936 // Figure out where to get and map in the main file.
937 auto FileOrErr = InputFile == "-"
938 ? FileMgr.getSTDIN()
939 : FileMgr.getFileRef(InputFile, /*OpenFile=*/true);
940 if (!FileOrErr) {
941 auto EC = llvm::errorToErrorCode(FileOrErr.takeError());
942 if (InputFile != "-")
943 Diags.Report(diag::err_fe_error_reading) << InputFile << EC.message();
944 else
945 Diags.Report(diag::err_fe_error_reading_stdin) << EC.message();
946 return false;
947 }
948
949 SourceMgr.setMainFileID(
950 SourceMgr.createFileID(*FileOrErr, SourceLocation(), Kind));
951
952 assert(SourceMgr.getMainFileID().isValid() &&
953 "Couldn't establish MainFileID!");
954 return true;
955}
956
957// High-Level Operations
958
960 assert(hasDiagnostics() && "Diagnostics engine is not initialized!");
961 assert(!getFrontendOpts().ShowHelp && "Client must handle '-help'!");
962 assert(!getFrontendOpts().ShowVersion && "Client must handle '-version'!");
963
964 // Mark this point as the bottom of the stack if we don't have somewhere
965 // better. We generally expect frontend actions to be invoked with (nearly)
966 // DesiredStackSpace available.
968
969 llvm::scope_exit FinishDiagnosticClient([&]() {
970 // Notify the diagnostic client that all files were processed.
972 });
973
974 raw_ostream &OS = getVerboseOutputStream();
975
976 if (!Act.PrepareToExecute(*this))
977 return false;
978
979 if (!createTarget())
980 return false;
981
982 // rewriter project will change target built-in bool type from its default.
983 if (getFrontendOpts().ProgramAction == frontend::RewriteObjC)
985
986 // Validate/process some options.
987 if (getHeaderSearchOpts().Verbose)
988 OS << "clang -cc1 version " CLANG_VERSION_STRING << " based upon LLVM "
989 << LLVM_VERSION_STRING << " default target "
990 << llvm::sys::getDefaultTargetTriple() << "\n";
991
992 if (getFrontendOpts().ShowStats || !getFrontendOpts().StatsFile.empty())
993 llvm::EnableStatistics(false);
994
995 // Sort vectors containing toc data and no toc data variables to facilitate
996 // binary search later.
997 llvm::sort(getCodeGenOpts().TocDataVarsUserSpecified);
998 llvm::sort(getCodeGenOpts().NoTocDataVars);
999
1000 for (const FrontendInputFile &FIF : getFrontendOpts().Inputs) {
1001 // Reset the ID tables if we are reusing the SourceManager and parsing
1002 // regular files.
1003 if (hasSourceManager() && !Act.isModelParsingAction())
1005
1006 if (Act.BeginSourceFile(*this, FIF)) {
1007 if (llvm::Error Err = Act.Execute()) {
1008 consumeError(std::move(Err)); // FIXME this drops errors on the floor.
1009 }
1010 Act.EndSourceFile();
1011 }
1012 }
1013
1015
1016 if (getFrontendOpts().ShowStats) {
1017 if (hasFileManager()) {
1019 OS << '\n';
1020 }
1021 llvm::PrintStatistics(OS);
1022 }
1023 StringRef StatsFile = getFrontendOpts().StatsFile;
1024 if (!StatsFile.empty()) {
1025 llvm::sys::fs::OpenFlags FileFlags = llvm::sys::fs::OF_TextWithCRLF;
1026 if (getFrontendOpts().AppendStats)
1027 FileFlags |= llvm::sys::fs::OF_Append;
1028 std::error_code EC;
1029 auto StatS =
1030 std::make_unique<llvm::raw_fd_ostream>(StatsFile, EC, FileFlags);
1031 if (EC) {
1032 getDiagnostics().Report(diag::warn_fe_unable_to_open_stats_file)
1033 << StatsFile << EC.message();
1034 } else {
1035 llvm::PrintStatisticsJSON(*StatS);
1036 }
1037 }
1038
1039 return !getDiagnostics().getClient()->getNumErrors();
1040}
1041
1043 if (!getDiagnosticOpts().ShowCarets)
1044 return;
1045
1046 raw_ostream &OS = getVerboseOutputStream();
1047
1048 // We can have multiple diagnostics sharing one diagnostic client.
1049 // Get the total number of warnings/errors from the client.
1050 unsigned NumWarnings = getDiagnostics().getClient()->getNumWarnings();
1051 unsigned NumErrors = getDiagnostics().getClient()->getNumErrors();
1052
1053 if (NumWarnings)
1054 OS << NumWarnings << " warning" << (NumWarnings == 1 ? "" : "s");
1055 if (NumWarnings && NumErrors)
1056 OS << " and ";
1057 if (NumErrors)
1058 OS << NumErrors << " error" << (NumErrors == 1 ? "" : "s");
1059 if (NumWarnings || NumErrors) {
1060 OS << " generated";
1061 if (getLangOpts().CUDA) {
1062 if (!getLangOpts().CUDAIsDevice) {
1063 OS << " when compiling for host";
1064 } else {
1065 OS << " when compiling for "
1066 << (!getTargetOpts().CPU.empty() ? getTargetOpts().CPU
1067 : getTarget().getTriple().str());
1068 }
1069 }
1070 OS << ".\n";
1071 }
1072}
1073
1075 // Load any requested plugins.
1076 for (const std::string &Path : getFrontendOpts().Plugins) {
1077 std::string Error;
1078 if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(Path.c_str(), &Error))
1079 getDiagnostics().Report(diag::err_fe_unable_to_load_plugin)
1080 << Path << Error;
1081 }
1082
1083 // Load and store pass plugins for the back-end.
1084 for (const std::string &Path : getCodeGenOpts().PassPlugins) {
1085 if (auto PassPlugin = llvm::PassPlugin::Load(Path)) {
1086 PassPlugins.emplace_back(std::make_unique<llvm::PassPlugin>(*PassPlugin));
1087 } else {
1088 getDiagnostics().Report(diag::err_fe_unable_to_load_plugin)
1089 << Path << toString(PassPlugin.takeError());
1090 }
1091 }
1092
1093 // Check if any of the loaded plugins replaces the main AST action
1094 for (const FrontendPluginRegistry::entry &Plugin :
1095 FrontendPluginRegistry::entries()) {
1096 std::unique_ptr<PluginASTAction> P(Plugin.instantiate());
1097 if (P->getActionType() == PluginASTAction::ReplaceAction) {
1099 getFrontendOpts().ActionName = Plugin.getName().str();
1100 break;
1101 }
1102 }
1103}
1104
1105/// Determine the appropriate source input kind based on language
1106/// options.
1108 if (LangOpts.OpenCL)
1109 return Language::OpenCL;
1110 if (LangOpts.CUDA)
1111 return Language::CUDA;
1112 if (LangOpts.ObjC)
1113 return LangOpts.CPlusPlus ? Language::ObjCXX : Language::ObjC;
1114 return LangOpts.CPlusPlus ? Language::CXX : Language::C;
1115}
1116
1117std::unique_ptr<CompilerInstance> CompilerInstance::cloneForModuleCompileImpl(
1118 SourceLocation ImportLoc, StringRef ModuleName, FrontendInputFile Input,
1119 StringRef OriginalModuleMapFile, StringRef ModuleFileName,
1120 std::optional<ThreadSafeCloneConfig> ThreadSafeConfig) {
1121 // Construct a compiler invocation for creating this module.
1122 auto Invocation = std::make_shared<CompilerInvocation>(getInvocation());
1123
1124 PreprocessorOptions &PPOpts = Invocation->getPreprocessorOpts();
1125
1126 // For any options that aren't intended to affect how a module is built,
1127 // reset them to their default values.
1128 Invocation->resetNonModularOptions();
1129
1130 // Remove any macro definitions that are explicitly ignored by the module.
1131 // They aren't supposed to affect how the module is built anyway.
1132 HeaderSearchOptions &HSOpts = Invocation->getHeaderSearchOpts();
1133 llvm::erase_if(PPOpts.Macros,
1134 [&HSOpts](const std::pair<std::string, bool> &def) {
1135 StringRef MacroDef = def.first;
1136 return HSOpts.ModulesIgnoreMacros.contains(
1137 llvm::CachedHashString(MacroDef.split('=').first));
1138 });
1139
1140 // If the original compiler invocation had -fmodule-name, pass it through.
1141 Invocation->getLangOpts().ModuleName =
1143
1144 // Note the name of the module we're building.
1145 Invocation->getLangOpts().CurrentModule = std::string(ModuleName);
1146
1147 // If there is a module map file, build the module using the module map.
1148 // Set up the inputs/outputs so that we build the module from its umbrella
1149 // header.
1150 FrontendOptions &FrontendOpts = Invocation->getFrontendOpts();
1151 FrontendOpts.OutputFile = ModuleFileName.str();
1152 FrontendOpts.DisableFree = false;
1153 FrontendOpts.GenerateGlobalModuleIndex = false;
1154 FrontendOpts.BuildingImplicitModule = true;
1155 FrontendOpts.OriginalModuleMap = std::string(OriginalModuleMapFile);
1156 // Force implicitly-built modules to hash the content of the module file.
1157 HSOpts.ModulesHashContent = true;
1158 FrontendOpts.Inputs = {std::move(Input)};
1159
1160 // Don't free the remapped file buffers; they are owned by our caller.
1161 PPOpts.RetainRemappedFileBuffers = true;
1162
1163 DiagnosticOptions &DiagOpts = Invocation->getDiagnosticOpts();
1164
1165 DiagOpts.VerifyDiagnostics = 0;
1166 assert(getInvocation().computeContextHash() ==
1167 Invocation->computeContextHash() &&
1168 "Module hash mismatch!");
1169
1170 // Construct a compiler instance that will be used to actually create the
1171 // module. Since we're sharing an in-memory module cache,
1172 // CompilerInstance::CompilerInstance is responsible for finalizing the
1173 // buffers to prevent use-after-frees.
1174 auto InstancePtr = std::make_unique<CompilerInstance>(
1175 std::move(Invocation), getPCHContainerOperations(), ModCache);
1176 auto &Instance = *InstancePtr;
1177
1178 auto &Inv = Instance.getInvocation();
1179
1180 if (ThreadSafeConfig) {
1181 Instance.setVirtualFileSystem(ThreadSafeConfig->getVFS());
1182 Instance.createFileManager();
1183 } else if (FrontendOpts.ModulesShareFileManager) {
1184 Instance.setVirtualFileSystem(getVirtualFileSystemPtr());
1185 Instance.setFileManager(getFileManagerPtr());
1186 } else {
1187 Instance.setVirtualFileSystem(getVirtualFileSystemPtr());
1188 Instance.createFileManager();
1189 }
1190
1191 if (ThreadSafeConfig) {
1192 Instance.createDiagnostics(&ThreadSafeConfig->getDiagConsumer(),
1193 /*ShouldOwnClient=*/false);
1194 } else {
1195 Instance.createDiagnostics(
1196 new ForwardingDiagnosticConsumer(getDiagnosticClient()),
1197 /*ShouldOwnClient=*/true);
1198 }
1199 if (llvm::is_contained(DiagOpts.SystemHeaderWarningsModules, ModuleName))
1200 Instance.getDiagnostics().setSuppressSystemWarnings(false);
1201
1202 Instance.createSourceManager();
1203 SourceManager &SourceMgr = Instance.getSourceManager();
1204
1205 if (ThreadSafeConfig) {
1206 // Detecting cycles in the module graph is responsibility of the client.
1207 } else {
1208 // Note that this module is part of the module build stack, so that we
1209 // can detect cycles in the module graph.
1210 SourceMgr.setModuleBuildStack(getSourceManager().getModuleBuildStack());
1211 SourceMgr.pushModuleBuildStack(
1212 ModuleName, FullSourceLoc(ImportLoc, getSourceManager()));
1213 }
1214
1215 // Make a copy for the new instance.
1216 Instance.FailedModules = FailedModules;
1217
1218 if (GetDependencyDirectives)
1219 Instance.GetDependencyDirectives =
1220 GetDependencyDirectives->cloneFor(Instance.getFileManager());
1221
1222 if (ThreadSafeConfig) {
1223 Instance.setModuleDepCollector(ThreadSafeConfig->getModuleDepCollector());
1224 } else {
1225 // If we're collecting module dependencies, we need to share a collector
1226 // between all of the module CompilerInstances. Other than that, we don't
1227 // want to produce any dependency output from the module build.
1228 Instance.setModuleDepCollector(getModuleDepCollector());
1229 }
1230 Inv.getDependencyOutputOpts() = DependencyOutputOptions();
1231
1232 return InstancePtr;
1233}
1234
1236 StringRef ModuleName,
1237 StringRef ModuleFileName,
1238 CompilerInstance &Instance) {
1239 llvm::TimeTraceScope TimeScope("Module Compile", ModuleName);
1240
1241 // Never compile a module that's already finalized - this would cause the
1242 // existing module to be freed, causing crashes if it is later referenced
1243 if (getModuleCache().getInMemoryModuleCache().isPCMFinal(ModuleFileName)) {
1244 getDiagnostics().Report(ImportLoc, diag::err_module_rebuild_finalized)
1245 << ModuleName;
1246 return false;
1247 }
1248
1249 getDiagnostics().Report(ImportLoc, diag::remark_module_build)
1250 << ModuleName << ModuleFileName;
1251
1252 // Execute the action to actually build the module in-place. Use a separate
1253 // thread so that we get a stack large enough.
1254 bool Crashed = !llvm::CrashRecoveryContext().RunSafelyOnNewStack(
1255 [&]() {
1257 Instance.ExecuteAction(Action);
1258 },
1260
1261 getDiagnostics().Report(ImportLoc, diag::remark_module_build_done)
1262 << ModuleName;
1263
1264 // Propagate the statistics to the parent FileManager.
1265 if (!getFrontendOpts().ModulesShareFileManager)
1266 getFileManager().AddStats(Instance.getFileManager());
1267
1268 // Propagate the failed modules to the parent instance.
1269 FailedModules = std::move(Instance.FailedModules);
1270
1271 if (Crashed) {
1272 // Clear the ASTConsumer if it hasn't been already, in case it owns streams
1273 // that must be closed before clearing output files.
1274 Instance.setSema(nullptr);
1275 Instance.setASTConsumer(nullptr);
1276
1277 // Delete any remaining temporary files related to Instance.
1278 Instance.clearOutputFiles(/*EraseFiles=*/true);
1279 }
1280
1281 // We've rebuilt a module. If we're allowed to generate or update the global
1282 // module index, record that fact in the importing compiler instance.
1283 if (getFrontendOpts().GenerateGlobalModuleIndex) {
1285 }
1286
1287 // If \p AllowPCMWithCompilerErrors is set return 'success' even if errors
1288 // occurred.
1289 return !Instance.getDiagnostics().hasErrorOccurred() ||
1290 Instance.getFrontendOpts().AllowPCMWithCompilerErrors;
1291}
1292
1295 StringRef Filename = llvm::sys::path::filename(File.getName());
1296 SmallString<128> PublicFilename(File.getDir().getName());
1297 if (Filename == "module_private.map")
1298 llvm::sys::path::append(PublicFilename, "module.map");
1299 else if (Filename == "module.private.modulemap")
1300 llvm::sys::path::append(PublicFilename, "module.modulemap");
1301 else
1302 return std::nullopt;
1303 return FileMgr.getOptionalFileRef(PublicFilename);
1304}
1305
1306std::unique_ptr<CompilerInstance> CompilerInstance::cloneForModuleCompile(
1307 SourceLocation ImportLoc, const Module *Module, StringRef ModuleFileName,
1308 std::optional<ThreadSafeCloneConfig> ThreadSafeConfig) {
1309 StringRef ModuleName = Module->getTopLevelModuleName();
1310
1312
1313 // Get or create the module map that we'll use to build this module.
1315 SourceManager &SourceMgr = getSourceManager();
1316
1317 if (FileID ModuleMapFID = ModMap.getContainingModuleMapFileID(Module);
1318 ModuleMapFID.isValid()) {
1319 // We want to use the top-level module map. If we don't, the compiling
1320 // instance may think the containing module map is a top-level one, while
1321 // the importing instance knows it's included from a parent module map via
1322 // the extern directive. This mismatch could bite us later.
1323 SourceLocation Loc = SourceMgr.getIncludeLoc(ModuleMapFID);
1324 while (Loc.isValid() && isModuleMap(SourceMgr.getFileCharacteristic(Loc))) {
1325 ModuleMapFID = SourceMgr.getFileID(Loc);
1326 Loc = SourceMgr.getIncludeLoc(ModuleMapFID);
1327 }
1328
1329 OptionalFileEntryRef ModuleMapFile =
1330 SourceMgr.getFileEntryRefForID(ModuleMapFID);
1331 assert(ModuleMapFile && "Top-level module map with no FileID");
1332
1333 // Canonicalize compilation to start with the public module map. This is
1334 // vital for submodules declarations in the private module maps to be
1335 // correctly parsed when depending on a top level module in the public one.
1336 if (OptionalFileEntryRef PublicMMFile =
1337 getPublicModuleMap(*ModuleMapFile, getFileManager()))
1338 ModuleMapFile = PublicMMFile;
1339
1340 StringRef ModuleMapFilePath = ModuleMapFile->getNameAsRequested();
1341
1342 // Use the systemness of the module map as parsed instead of using the
1343 // IsSystem attribute of the module. If the module has [system] but the
1344 // module map is not in a system path, then this would incorrectly parse
1345 // any other modules in that module map as system too.
1346 const SrcMgr::SLocEntry &SLoc = SourceMgr.getSLocEntry(ModuleMapFID);
1347 bool IsSystem = isSystem(SLoc.getFile().getFileCharacteristic());
1348
1349 // Use the module map where this module resides.
1350 return cloneForModuleCompileImpl(
1351 ImportLoc, ModuleName,
1352 FrontendInputFile(ModuleMapFilePath, IK, IsSystem),
1353 ModMap.getModuleMapFileForUniquing(Module)->getName(), ModuleFileName,
1354 std::move(ThreadSafeConfig));
1355 }
1356
1357 // FIXME: We only need to fake up an input file here as a way of
1358 // transporting the module's directory to the module map parser. We should
1359 // be able to do that more directly, and parse from a memory buffer without
1360 // inventing this file.
1361 SmallString<128> FakeModuleMapFile(Module->Directory->getName());
1362 llvm::sys::path::append(FakeModuleMapFile, "__inferred_module.map");
1363
1364 std::string InferredModuleMapContent;
1365 llvm::raw_string_ostream OS(InferredModuleMapContent);
1366 Module->print(OS);
1367
1368 auto Instance = cloneForModuleCompileImpl(
1369 ImportLoc, ModuleName,
1370 FrontendInputFile(FakeModuleMapFile, IK, +Module->IsSystem),
1371 ModMap.getModuleMapFileForUniquing(Module)->getName(), ModuleFileName,
1372 std::move(ThreadSafeConfig));
1373
1374 std::unique_ptr<llvm::MemoryBuffer> ModuleMapBuffer =
1375 llvm::MemoryBuffer::getMemBufferCopy(InferredModuleMapContent);
1376 FileEntryRef ModuleMapFile = Instance->getFileManager().getVirtualFileRef(
1377 FakeModuleMapFile, InferredModuleMapContent.size(), 0);
1378 Instance->getSourceManager().overrideFileContents(ModuleMapFile,
1379 std::move(ModuleMapBuffer));
1380
1381 return Instance;
1382}
1383
1384/// Read the AST right after compiling the module.
1385static bool readASTAfterCompileModule(CompilerInstance &ImportingInstance,
1386 SourceLocation ImportLoc,
1387 SourceLocation ModuleNameLoc,
1388 Module *Module, StringRef ModuleFileName,
1389 bool *OutOfDate, bool *Missing) {
1390 DiagnosticsEngine &Diags = ImportingInstance.getDiagnostics();
1391
1392 unsigned ModuleLoadCapabilities = ASTReader::ARR_Missing;
1393 if (OutOfDate)
1394 ModuleLoadCapabilities |= ASTReader::ARR_OutOfDate;
1395
1396 // Try to read the module file, now that we've compiled it.
1397 ASTReader::ASTReadResult ReadResult =
1398 ImportingInstance.getASTReader()->ReadAST(
1399 ModuleFileName, serialization::MK_ImplicitModule, ImportLoc,
1400 ModuleLoadCapabilities);
1401 if (ReadResult == ASTReader::Success)
1402 return true;
1403
1404 // The caller wants to handle out-of-date failures.
1405 if (OutOfDate && ReadResult == ASTReader::OutOfDate) {
1406 *OutOfDate = true;
1407 return false;
1408 }
1409
1410 // The caller wants to handle missing module files.
1411 if (Missing && ReadResult == ASTReader::Missing) {
1412 *Missing = true;
1413 return false;
1414 }
1415
1416 // The ASTReader didn't diagnose the error, so conservatively report it.
1417 if (ReadResult == ASTReader::Missing || !Diags.hasErrorOccurred())
1418 Diags.Report(ModuleNameLoc, diag::err_module_not_built)
1419 << Module->Name << SourceRange(ImportLoc, ModuleNameLoc);
1420
1421 return false;
1422}
1423
1424/// Compile a module in a separate compiler instance and read the AST,
1425/// returning true if the module compiles without errors.
1426static bool compileModuleAndReadASTImpl(CompilerInstance &ImportingInstance,
1427 SourceLocation ImportLoc,
1428 SourceLocation ModuleNameLoc,
1429 Module *Module,
1430 StringRef ModuleFileName) {
1431 {
1432 auto Instance = ImportingInstance.cloneForModuleCompile(
1433 ModuleNameLoc, Module, ModuleFileName);
1434
1435 if (!ImportingInstance.compileModule(ModuleNameLoc,
1437 ModuleFileName, *Instance)) {
1438 ImportingInstance.getDiagnostics().Report(ModuleNameLoc,
1439 diag::err_module_not_built)
1440 << Module->Name << SourceRange(ImportLoc, ModuleNameLoc);
1441 return false;
1442 }
1443 }
1444
1445 // The module is built successfully, we can update its timestamp now.
1446 if (ImportingInstance.getPreprocessor()
1450 ImportingInstance.getModuleCache().updateModuleTimestamp(ModuleFileName);
1451 }
1452
1453 return readASTAfterCompileModule(ImportingInstance, ImportLoc, ModuleNameLoc,
1454 Module, ModuleFileName,
1455 /*OutOfDate=*/nullptr, /*Missing=*/nullptr);
1456}
1457
1458/// Compile a module in a separate compiler instance and read the AST,
1459/// returning true if the module compiles without errors, using a lock manager
1460/// to avoid building the same module in multiple compiler instances.
1461///
1462/// Uses a lock file manager and exponential backoff to reduce the chances that
1463/// multiple instances will compete to create the same module. On timeout,
1464/// deletes the lock file in order to avoid deadlock from crashing processes or
1465/// bugs in the lock file manager.
1467 CompilerInstance &ImportingInstance, SourceLocation ImportLoc,
1468 SourceLocation ModuleNameLoc, Module *Module, StringRef ModuleFileName) {
1469 DiagnosticsEngine &Diags = ImportingInstance.getDiagnostics();
1470
1471 Diags.Report(ModuleNameLoc, diag::remark_module_lock)
1472 << ModuleFileName << Module->Name;
1473
1474 auto &ModuleCache = ImportingInstance.getModuleCache();
1475 ModuleCache.prepareForGetLock(ModuleFileName);
1476
1477 while (true) {
1478 auto Lock = ModuleCache.getLock(ModuleFileName);
1479 bool Owned;
1480 if (llvm::Error Err = Lock->tryLock().moveInto(Owned)) {
1481 // ModuleCache takes care of correctness and locks are only necessary for
1482 // performance. Fallback to building the module in case of any lock
1483 // related errors.
1484 Diags.Report(ModuleNameLoc, diag::remark_module_lock_failure)
1485 << Module->Name << toString(std::move(Err));
1486 return compileModuleAndReadASTImpl(ImportingInstance, ImportLoc,
1487 ModuleNameLoc, Module, ModuleFileName);
1488 }
1489 if (Owned) {
1490 // We're responsible for building the module ourselves.
1491 return compileModuleAndReadASTImpl(ImportingInstance, ImportLoc,
1492 ModuleNameLoc, Module, ModuleFileName);
1493 }
1494
1495 // Someone else is responsible for building the module. Wait for them to
1496 // finish.
1497 switch (Lock->waitForUnlockFor(std::chrono::seconds(90))) {
1498 case llvm::WaitForUnlockResult::Success:
1499 break; // The interesting case.
1500 case llvm::WaitForUnlockResult::OwnerDied:
1501 continue; // try again to get the lock.
1502 case llvm::WaitForUnlockResult::Timeout:
1503 // Since the InMemoryModuleCache takes care of correctness, we try waiting
1504 // for someone else to complete the build so that it does not happen
1505 // twice. In case of timeout, build it ourselves.
1506 Diags.Report(ModuleNameLoc, diag::remark_module_lock_timeout)
1507 << Module->Name;
1508 // Clear the lock file so that future invocations can make progress.
1509 Lock->unsafeMaybeUnlock();
1510 continue;
1511 }
1512
1513 // Read the module that was just written by someone else.
1514 bool OutOfDate = false;
1515 bool Missing = false;
1516 if (readASTAfterCompileModule(ImportingInstance, ImportLoc, ModuleNameLoc,
1517 Module, ModuleFileName, &OutOfDate, &Missing))
1518 return true;
1519 if (!OutOfDate && !Missing)
1520 return false;
1521
1522 // The module may be missing or out of date in the presence of file system
1523 // races. It may also be out of date if one of its imports depends on header
1524 // search paths that are not consistent with this ImportingInstance.
1525 // Try again...
1526 }
1527}
1528
1529/// Compile a module in a separate compiler instance and read the AST,
1530/// returning true if the module compiles without errors, potentially using a
1531/// lock manager to avoid building the same module in multiple compiler
1532/// instances.
1533static bool compileModuleAndReadAST(CompilerInstance &ImportingInstance,
1534 SourceLocation ImportLoc,
1535 SourceLocation ModuleNameLoc,
1536 Module *Module, StringRef ModuleFileName) {
1537 return ImportingInstance.getInvocation()
1540 ? compileModuleAndReadASTBehindLock(ImportingInstance, ImportLoc,
1541 ModuleNameLoc, Module,
1542 ModuleFileName)
1543 : compileModuleAndReadASTImpl(ImportingInstance, ImportLoc,
1544 ModuleNameLoc, Module,
1545 ModuleFileName);
1546}
1547
1548/// Diagnose differences between the current definition of the given
1549/// configuration macro and the definition provided on the command line.
1550static void checkConfigMacro(Preprocessor &PP, StringRef ConfigMacro,
1551 Module *Mod, SourceLocation ImportLoc) {
1552 IdentifierInfo *Id = PP.getIdentifierInfo(ConfigMacro);
1553 SourceManager &SourceMgr = PP.getSourceManager();
1554
1555 // If this identifier has never had a macro definition, then it could
1556 // not have changed.
1557 if (!Id->hadMacroDefinition())
1558 return;
1559 auto *LatestLocalMD = PP.getLocalMacroDirectiveHistory(Id);
1560
1561 // Find the macro definition from the command line.
1562 MacroInfo *CmdLineDefinition = nullptr;
1563 for (auto *MD = LatestLocalMD; MD; MD = MD->getPrevious()) {
1564 // We only care about the predefines buffer.
1565 FileID FID = SourceMgr.getFileID(MD->getLocation());
1566 if (FID.isInvalid())
1567 continue;
1568 if (FID != PP.getPredefinesFileID() && FID != PP.getPCHPredefinesFileID())
1569 continue;
1570 if (auto *DMD = dyn_cast<DefMacroDirective>(MD))
1571 CmdLineDefinition = DMD->getMacroInfo();
1572 break;
1573 }
1574
1575 auto *CurrentDefinition = PP.getMacroInfo(Id);
1576 if (CurrentDefinition == CmdLineDefinition) {
1577 // Macro matches. Nothing to do.
1578 } else if (!CurrentDefinition) {
1579 // This macro was defined on the command line, then #undef'd later.
1580 // Complain.
1581 PP.Diag(ImportLoc, diag::warn_module_config_macro_undef)
1582 << true << ConfigMacro << Mod->getFullModuleName();
1583 auto LatestDef = LatestLocalMD->getDefinition();
1584 assert(LatestDef.isUndefined() &&
1585 "predefined macro went away with no #undef?");
1586 PP.Diag(LatestDef.getUndefLocation(), diag::note_module_def_undef_here)
1587 << true;
1588 return;
1589 } else if (!CmdLineDefinition) {
1590 // There was no definition for this macro in the predefines buffer,
1591 // but there was a local definition. Complain.
1592 PP.Diag(ImportLoc, diag::warn_module_config_macro_undef)
1593 << false << ConfigMacro << Mod->getFullModuleName();
1594 PP.Diag(CurrentDefinition->getDefinitionLoc(),
1595 diag::note_module_def_undef_here)
1596 << false;
1597 } else if (!CurrentDefinition->isIdenticalTo(*CmdLineDefinition, PP,
1598 /*Syntactically=*/true)) {
1599 // The macro definitions differ.
1600 PP.Diag(ImportLoc, diag::warn_module_config_macro_undef)
1601 << false << ConfigMacro << Mod->getFullModuleName();
1602 PP.Diag(CurrentDefinition->getDefinitionLoc(),
1603 diag::note_module_def_undef_here)
1604 << false;
1605 }
1606}
1607
1609 SourceLocation ImportLoc) {
1610 clang::Module *TopModule = M->getTopLevelModule();
1611 for (const StringRef ConMacro : TopModule->ConfigMacros) {
1612 checkConfigMacro(PP, ConMacro, M, ImportLoc);
1613 }
1614}
1615
1617 if (TheASTReader)
1618 return;
1619
1620 if (!hasASTContext())
1622
1623 // If we're implicitly building modules but not currently recursively
1624 // building a module, check whether we need to prune the module cache.
1625 if (getSourceManager().getModuleBuildStack().empty() &&
1627 .getHeaderSearchInfo()
1629 .empty())
1630 ModCache->maybePrune(getHeaderSearchOpts().ModuleCachePath,
1631 getHeaderSearchOpts().ModuleCachePruneInterval,
1632 getHeaderSearchOpts().ModuleCachePruneAfter);
1633
1635 std::string Sysroot = HSOpts.Sysroot;
1636 const PreprocessorOptions &PPOpts = getPreprocessorOpts();
1637 const FrontendOptions &FEOpts = getFrontendOpts();
1638 std::unique_ptr<llvm::Timer> ReadTimer;
1639
1640 if (timerGroup)
1641 ReadTimer = std::make_unique<llvm::Timer>("reading_modules",
1642 "Reading modules", *timerGroup);
1643 TheASTReader = llvm::makeIntrusiveRefCnt<ASTReader>(
1646 getFrontendOpts().ModuleFileExtensions,
1647 Sysroot.empty() ? "" : Sysroot.c_str(),
1649 /*AllowASTWithCompilerErrors=*/FEOpts.AllowPCMWithCompilerErrors,
1650 /*AllowConfigurationMismatch=*/false,
1654 +getFrontendOpts().UseGlobalModuleIndex, std::move(ReadTimer));
1655 if (hasASTConsumer()) {
1656 TheASTReader->setDeserializationListener(
1657 getASTConsumer().GetASTDeserializationListener());
1659 getASTConsumer().GetASTMutationListener());
1660 }
1661 getASTContext().setExternalSource(TheASTReader);
1662 if (hasSema())
1663 TheASTReader->InitializeSema(getSema());
1664 if (hasASTConsumer())
1665 TheASTReader->StartTranslationUnit(&getASTConsumer());
1666
1667 for (auto &Listener : DependencyCollectors)
1668 Listener->attachToASTReader(*TheASTReader);
1669}
1670
1672 StringRef FileName, serialization::ModuleFile *&LoadedModuleFile) {
1673 llvm::Timer Timer;
1674 if (timerGroup)
1675 Timer.init("preloading." + FileName.str(), "Preloading " + FileName.str(),
1676 *timerGroup);
1677 llvm::TimeRegion TimeLoading(timerGroup ? &Timer : nullptr);
1678
1679 // If we don't already have an ASTReader, create one now.
1680 if (!TheASTReader)
1682
1683 // If -Wmodule-file-config-mismatch is mapped as an error or worse, allow the
1684 // ASTReader to diagnose it, since it can produce better errors that we can.
1685 bool ConfigMismatchIsRecoverable =
1686 getDiagnostics().getDiagnosticLevel(diag::warn_ast_file_config_mismatch,
1687 SourceLocation()) <=
1689
1690 auto Listener = std::make_unique<ReadModuleNames>(*PP);
1691 auto &ListenerRef = *Listener;
1692 ASTReader::ListenerScope ReadModuleNamesListener(*TheASTReader,
1693 std::move(Listener));
1694
1695 // Try to load the module file.
1696 switch (TheASTReader->ReadAST(
1698 ConfigMismatchIsRecoverable ? ASTReader::ARR_ConfigurationMismatch : 0,
1699 &LoadedModuleFile)) {
1700 case ASTReader::Success:
1701 // We successfully loaded the module file; remember the set of provided
1702 // modules so that we don't try to load implicit modules for them.
1703 ListenerRef.registerAll();
1704 return true;
1705
1707 // Ignore unusable module files.
1709 diag::warn_ast_file_config_mismatch)
1710 << FileName;
1711 // All modules provided by any files we tried and failed to load are now
1712 // unavailable; includes of those modules should now be handled textually.
1713 ListenerRef.markAllUnavailable();
1714 return true;
1715
1716 default:
1717 return false;
1718 }
1719}
1720
1721namespace {
1722enum ModuleSource {
1723 MS_ModuleNotFound,
1724 MS_ModuleCache,
1725 MS_PrebuiltModulePath,
1726 MS_ModuleBuildPragma
1727};
1728} // end namespace
1729
1730/// Select a source for loading the named module and compute the filename to
1731/// load it from.
1732static ModuleSource selectModuleSource(
1733 Module *M, StringRef ModuleName, std::string &ModuleFilename,
1734 const std::map<std::string, std::string, std::less<>> &BuiltModules,
1735 HeaderSearch &HS) {
1736 assert(ModuleFilename.empty() && "Already has a module source?");
1737
1738 // Check to see if the module has been built as part of this compilation
1739 // via a module build pragma.
1740 auto BuiltModuleIt = BuiltModules.find(ModuleName);
1741 if (BuiltModuleIt != BuiltModules.end()) {
1742 ModuleFilename = BuiltModuleIt->second;
1743 return MS_ModuleBuildPragma;
1744 }
1745
1746 // Try to load the module from the prebuilt module path.
1747 const HeaderSearchOptions &HSOpts = HS.getHeaderSearchOpts();
1748 if (!HSOpts.PrebuiltModuleFiles.empty() ||
1749 !HSOpts.PrebuiltModulePaths.empty()) {
1750 ModuleFilename = HS.getPrebuiltModuleFileName(ModuleName);
1751 if (HSOpts.EnablePrebuiltImplicitModules && ModuleFilename.empty())
1752 ModuleFilename = HS.getPrebuiltImplicitModuleFileName(M);
1753 if (!ModuleFilename.empty())
1754 return MS_PrebuiltModulePath;
1755 }
1756
1757 // Try to load the module from the module cache.
1758 if (M) {
1759 ModuleFilename = HS.getCachedModuleFileName(M);
1760 return MS_ModuleCache;
1761 }
1762
1763 return MS_ModuleNotFound;
1764}
1765
1766ModuleLoadResult CompilerInstance::findOrCompileModuleAndReadAST(
1767 StringRef ModuleName, SourceLocation ImportLoc,
1768 SourceLocation ModuleNameLoc, bool IsInclusionDirective) {
1769 // Search for a module with the given name.
1770 HeaderSearch &HS = PP->getHeaderSearchInfo();
1771 Module *M =
1772 HS.lookupModule(ModuleName, ImportLoc, true, !IsInclusionDirective);
1773
1774 // Check for any configuration macros that have changed. This is done
1775 // immediately before potentially building a module in case this module
1776 // depends on having one of its configuration macros defined to successfully
1777 // build. If this is not done the user will never see the warning.
1778 if (M)
1779 checkConfigMacros(getPreprocessor(), M, ImportLoc);
1780
1781 // Select the source and filename for loading the named module.
1782 std::string ModuleFilename;
1783 ModuleSource Source =
1784 selectModuleSource(M, ModuleName, ModuleFilename, BuiltModules, HS);
1785 if (Source == MS_ModuleNotFound) {
1786 // We can't find a module, error out here.
1787 getDiagnostics().Report(ModuleNameLoc, diag::err_module_not_found)
1788 << ModuleName << SourceRange(ImportLoc, ModuleNameLoc);
1789 return nullptr;
1790 }
1791 if (ModuleFilename.empty()) {
1792 if (M && M->HasIncompatibleModuleFile) {
1793 // We tried and failed to load a module file for this module. Fall
1794 // back to textual inclusion for its headers.
1796 }
1797
1798 getDiagnostics().Report(ModuleNameLoc, diag::err_module_build_disabled)
1799 << ModuleName;
1800 return nullptr;
1801 }
1802
1803 // Create an ASTReader on demand.
1804 if (!getASTReader())
1806
1807 // Time how long it takes to load the module.
1808 llvm::Timer Timer;
1809 if (timerGroup)
1810 Timer.init("loading." + ModuleFilename, "Loading " + ModuleFilename,
1811 *timerGroup);
1812 llvm::TimeRegion TimeLoading(timerGroup ? &Timer : nullptr);
1813 llvm::TimeTraceScope TimeScope("Module Load", ModuleName);
1814
1815 // Try to load the module file. If we are not trying to load from the
1816 // module cache, we don't know how to rebuild modules.
1817 unsigned ARRFlags = Source == MS_ModuleCache
1820 : Source == MS_PrebuiltModulePath
1821 ? 0
1823 switch (getASTReader()->ReadAST(ModuleFilename,
1824 Source == MS_PrebuiltModulePath
1826 : Source == MS_ModuleBuildPragma
1829 ImportLoc, ARRFlags)) {
1830 case ASTReader::Success: {
1831 if (M)
1832 return M;
1833 assert(Source != MS_ModuleCache &&
1834 "missing module, but file loaded from cache");
1835
1836 // A prebuilt module is indexed as a ModuleFile; the Module does not exist
1837 // until the first call to ReadAST. Look it up now.
1838 M = HS.lookupModule(ModuleName, ImportLoc, true, !IsInclusionDirective);
1839
1840 // Check whether M refers to the file in the prebuilt module path.
1841 if (M && M->getASTFile())
1842 if (auto ModuleFile = FileMgr->getOptionalFileRef(ModuleFilename))
1843 if (*ModuleFile == M->getASTFile())
1844 return M;
1845
1846 getDiagnostics().Report(ModuleNameLoc, diag::err_module_prebuilt)
1847 << ModuleName;
1848 return ModuleLoadResult();
1849 }
1850
1852 case ASTReader::Missing:
1853 // The most interesting case.
1854 break;
1855
1857 if (Source == MS_PrebuiltModulePath)
1858 // FIXME: We shouldn't be setting HadFatalFailure below if we only
1859 // produce a warning here!
1860 getDiagnostics().Report(SourceLocation(),
1861 diag::warn_ast_file_config_mismatch)
1862 << ModuleFilename;
1863 // Fall through to error out.
1864 [[fallthrough]];
1868 // FIXME: The ASTReader will already have complained, but can we shoehorn
1869 // that diagnostic information into a more useful form?
1870 return ModuleLoadResult();
1871
1872 case ASTReader::Failure:
1874 return ModuleLoadResult();
1875 }
1876
1877 // ReadAST returned Missing or OutOfDate.
1878 if (Source != MS_ModuleCache) {
1879 // We don't know the desired configuration for this module and don't
1880 // necessarily even have a module map. Since ReadAST already produces
1881 // diagnostics for these two cases, we simply error out here.
1882 return ModuleLoadResult();
1883 }
1884
1885 // The module file is missing or out-of-date. Build it.
1886 assert(M && "missing module, but trying to compile for cache");
1887
1888 // Check whether there is a cycle in the module graph.
1890 ModuleBuildStack::iterator Pos = ModPath.begin(), PosEnd = ModPath.end();
1891 for (; Pos != PosEnd; ++Pos) {
1892 if (Pos->first == ModuleName)
1893 break;
1894 }
1895
1896 if (Pos != PosEnd) {
1897 SmallString<256> CyclePath;
1898 for (; Pos != PosEnd; ++Pos) {
1899 CyclePath += Pos->first;
1900 CyclePath += " -> ";
1901 }
1902 CyclePath += ModuleName;
1903
1904 getDiagnostics().Report(ModuleNameLoc, diag::err_module_cycle)
1905 << ModuleName << CyclePath;
1906 return nullptr;
1907 }
1908
1909 // Check whether we have already attempted to build this module (but failed).
1910 if (FailedModules.contains(ModuleName)) {
1911 getDiagnostics().Report(ModuleNameLoc, diag::err_module_not_built)
1912 << ModuleName << SourceRange(ImportLoc, ModuleNameLoc);
1913 return nullptr;
1914 }
1915
1916 // Try to compile and then read the AST.
1917 if (!compileModuleAndReadAST(*this, ImportLoc, ModuleNameLoc, M,
1918 ModuleFilename)) {
1919 assert(getDiagnostics().hasErrorOccurred() &&
1920 "undiagnosed error in compileModuleAndReadAST");
1921 FailedModules.insert(ModuleName);
1922 return nullptr;
1923 }
1924
1925 // Okay, we've rebuilt and now loaded the module.
1926 return M;
1927}
1928
1931 ModuleIdPath Path,
1933 bool IsInclusionDirective) {
1934 // Determine what file we're searching from.
1935 StringRef ModuleName = Path[0].getIdentifierInfo()->getName();
1936 SourceLocation ModuleNameLoc = Path[0].getLoc();
1937
1938 // If we've already handled this import, just return the cached result.
1939 // This one-element cache is important to eliminate redundant diagnostics
1940 // when both the preprocessor and parser see the same import declaration.
1941 if (ImportLoc.isValid() && LastModuleImportLoc == ImportLoc) {
1942 // Make the named module visible.
1943 if (LastModuleImportResult && ModuleName != getLangOpts().CurrentModule)
1944 TheASTReader->makeModuleVisible(LastModuleImportResult, Visibility,
1945 ImportLoc);
1946 return LastModuleImportResult;
1947 }
1948
1949 // If we don't already have information on this module, load the module now.
1950 Module *Module = nullptr;
1952 if (auto MaybeModule = MM.getCachedModuleLoad(*Path[0].getIdentifierInfo())) {
1953 // Use the cached result, which may be nullptr.
1954 Module = *MaybeModule;
1955 // Config macros are already checked before building a module, but they need
1956 // to be checked at each import location in case any of the config macros
1957 // have a new value at the current `ImportLoc`.
1958 if (Module)
1960 } else if (ModuleName == getLangOpts().CurrentModule) {
1961 // This is the module we're building.
1962 Module = PP->getHeaderSearchInfo().lookupModule(
1963 ModuleName, ImportLoc, /*AllowSearch*/ true,
1964 /*AllowExtraModuleMapSearch*/ !IsInclusionDirective);
1965
1966 // Config macros do not need to be checked here for two reasons.
1967 // * This will always be textual inclusion, and thus the config macros
1968 // actually do impact the content of the header.
1969 // * `Preprocessor::HandleHeaderIncludeOrImport` will never call this
1970 // function as the `#include` or `#import` is textual.
1971
1972 MM.cacheModuleLoad(*Path[0].getIdentifierInfo(), Module);
1973 } else {
1974 ModuleLoadResult Result = findOrCompileModuleAndReadAST(
1975 ModuleName, ImportLoc, ModuleNameLoc, IsInclusionDirective);
1976 if (!Result.isNormal())
1977 return Result;
1978 if (!Result)
1979 DisableGeneratingGlobalModuleIndex = true;
1980 Module = Result;
1981 MM.cacheModuleLoad(*Path[0].getIdentifierInfo(), Module);
1982 }
1983
1984 // If we never found the module, fail. Otherwise, verify the module and link
1985 // it up.
1986 if (!Module)
1987 return ModuleLoadResult();
1988
1989 // Verify that the rest of the module path actually corresponds to
1990 // a submodule.
1991 bool MapPrivateSubModToTopLevel = false;
1992 for (unsigned I = 1, N = Path.size(); I != N; ++I) {
1993 StringRef Name = Path[I].getIdentifierInfo()->getName();
1994 clang::Module *Sub = Module->findSubmodule(Name);
1995
1996 // If the user is requesting Foo.Private and it doesn't exist, try to
1997 // match Foo_Private and emit a warning asking for the user to write
1998 // @import Foo_Private instead. FIXME: remove this when existing clients
1999 // migrate off of Foo.Private syntax.
2000 if (!Sub && Name == "Private" && Module == Module->getTopLevelModule()) {
2001 SmallString<128> PrivateModule(Module->Name);
2002 PrivateModule.append("_Private");
2003
2005 auto &II = PP->getIdentifierTable().get(
2006 PrivateModule, PP->getIdentifierInfo(Module->Name)->getTokenID());
2007 PrivPath.emplace_back(Path[0].getLoc(), &II);
2008
2009 std::string FileName;
2010 // If there is a modulemap module or prebuilt module, load it.
2011 if (PP->getHeaderSearchInfo().lookupModule(PrivateModule, ImportLoc, true,
2012 !IsInclusionDirective) ||
2013 selectModuleSource(nullptr, PrivateModule, FileName, BuiltModules,
2014 PP->getHeaderSearchInfo()) != MS_ModuleNotFound)
2015 Sub = loadModule(ImportLoc, PrivPath, Visibility, IsInclusionDirective);
2016 if (Sub) {
2017 MapPrivateSubModToTopLevel = true;
2018 PP->markClangModuleAsAffecting(Module);
2019 if (!getDiagnostics().isIgnored(
2020 diag::warn_no_priv_submodule_use_toplevel, ImportLoc)) {
2021 getDiagnostics().Report(Path[I].getLoc(),
2022 diag::warn_no_priv_submodule_use_toplevel)
2023 << Path[I].getIdentifierInfo() << Module->getFullModuleName()
2024 << PrivateModule
2025 << SourceRange(Path[0].getLoc(), Path[I].getLoc())
2026 << FixItHint::CreateReplacement(SourceRange(Path[0].getLoc()),
2027 PrivateModule);
2028 getDiagnostics().Report(Sub->DefinitionLoc,
2029 diag::note_private_top_level_defined);
2030 }
2031 }
2032 }
2033
2034 if (!Sub) {
2035 // Attempt to perform typo correction to find a module name that works.
2037 unsigned BestEditDistance = (std::numeric_limits<unsigned>::max)();
2038
2039 for (class Module *SubModule : Module->submodules()) {
2040 unsigned ED =
2041 Name.edit_distance(SubModule->Name,
2042 /*AllowReplacements=*/true, BestEditDistance);
2043 if (ED <= BestEditDistance) {
2044 if (ED < BestEditDistance) {
2045 Best.clear();
2046 BestEditDistance = ED;
2047 }
2048
2049 Best.push_back(SubModule->Name);
2050 }
2051 }
2052
2053 // If there was a clear winner, user it.
2054 if (Best.size() == 1) {
2055 getDiagnostics().Report(Path[I].getLoc(),
2056 diag::err_no_submodule_suggest)
2057 << Path[I].getIdentifierInfo() << Module->getFullModuleName()
2058 << Best[0] << SourceRange(Path[0].getLoc(), Path[I - 1].getLoc())
2059 << FixItHint::CreateReplacement(SourceRange(Path[I].getLoc()),
2060 Best[0]);
2061
2062 Sub = Module->findSubmodule(Best[0]);
2063 }
2064 }
2065
2066 if (!Sub) {
2067 // No submodule by this name. Complain, and don't look for further
2068 // submodules.
2069 getDiagnostics().Report(Path[I].getLoc(), diag::err_no_submodule)
2070 << Path[I].getIdentifierInfo() << Module->getFullModuleName()
2071 << SourceRange(Path[0].getLoc(), Path[I - 1].getLoc());
2072 break;
2073 }
2074
2075 Module = Sub;
2076 }
2077
2078 // Make the named module visible, if it's not already part of the module
2079 // we are parsing.
2080 if (ModuleName != getLangOpts().CurrentModule) {
2081 if (!Module->IsFromModuleFile && !MapPrivateSubModToTopLevel) {
2082 // We have an umbrella header or directory that doesn't actually include
2083 // all of the headers within the directory it covers. Complain about
2084 // this missing submodule and recover by forgetting that we ever saw
2085 // this submodule.
2086 // FIXME: Should we detect this at module load time? It seems fairly
2087 // expensive (and rare).
2088 getDiagnostics().Report(ImportLoc, diag::warn_missing_submodule)
2090 << SourceRange(Path.front().getLoc(), Path.back().getLoc());
2091
2093 }
2094
2095 // Check whether this module is available.
2097 *Module, getDiagnostics())) {
2098 getDiagnostics().Report(ImportLoc, diag::note_module_import_here)
2099 << SourceRange(Path.front().getLoc(), Path.back().getLoc());
2100 LastModuleImportLoc = ImportLoc;
2101 LastModuleImportResult = ModuleLoadResult();
2102 return ModuleLoadResult();
2103 }
2104
2105 TheASTReader->makeModuleVisible(Module, Visibility, ImportLoc);
2106 }
2107
2108 // Resolve any remaining module using export_as for this one.
2111 .getModuleMap()
2113
2114 LastModuleImportLoc = ImportLoc;
2115 LastModuleImportResult = ModuleLoadResult(Module);
2116 return LastModuleImportResult;
2117}
2118
2120 StringRef ModuleName,
2121 StringRef Source) {
2122 // Avoid creating filenames with special characters.
2123 SmallString<128> CleanModuleName(ModuleName);
2124 for (auto &C : CleanModuleName)
2125 if (!isAlphanumeric(C))
2126 C = '_';
2127
2128 // FIXME: Using a randomized filename here means that our intermediate .pcm
2129 // output is nondeterministic (as .pcm files refer to each other by name).
2130 // Can this affect the output in any way?
2131 SmallString<128> ModuleFileName;
2132 if (std::error_code EC = llvm::sys::fs::createTemporaryFile(
2133 CleanModuleName, "pcm", ModuleFileName)) {
2134 getDiagnostics().Report(ImportLoc, diag::err_fe_unable_to_open_output)
2135 << ModuleFileName << EC.message();
2136 return;
2137 }
2138 std::string ModuleMapFileName = (CleanModuleName + ".map").str();
2139
2140 FrontendInputFile Input(
2141 ModuleMapFileName,
2142 InputKind(getLanguageFromOptions(Invocation->getLangOpts()),
2143 InputKind::ModuleMap, /*Preprocessed*/true));
2144
2145 std::string NullTerminatedSource(Source.str());
2146
2147 auto Other = cloneForModuleCompileImpl(ImportLoc, ModuleName, Input,
2148 StringRef(), ModuleFileName);
2149
2150 // Create a virtual file containing our desired source.
2151 // FIXME: We shouldn't need to do this.
2152 FileEntryRef ModuleMapFile = Other->getFileManager().getVirtualFileRef(
2153 ModuleMapFileName, NullTerminatedSource.size(), 0);
2154 Other->getSourceManager().overrideFileContents(
2155 ModuleMapFile, llvm::MemoryBuffer::getMemBuffer(NullTerminatedSource));
2156
2157 Other->BuiltModules = std::move(BuiltModules);
2158 Other->DeleteBuiltModules = false;
2159
2160 // Build the module, inheriting any modules that we've built locally.
2161 bool Success = compileModule(ImportLoc, ModuleName, ModuleFileName, *Other);
2162
2163 BuiltModules = std::move(Other->BuiltModules);
2164
2165 if (Success) {
2166 BuiltModules[std::string(ModuleName)] = std::string(ModuleFileName);
2167 llvm::sys::RemoveFileOnSignal(ModuleFileName);
2168 }
2169}
2170
2173 SourceLocation ImportLoc) {
2174 if (!TheASTReader)
2176 if (!TheASTReader)
2177 return;
2178
2179 TheASTReader->makeModuleVisible(Mod, Visibility, ImportLoc);
2180}
2181
2183 SourceLocation TriggerLoc) {
2184 if (getPreprocessor()
2185 .getHeaderSearchInfo()
2187 .empty())
2188 return nullptr;
2189 if (!TheASTReader)
2191 // Can't do anything if we don't have the module manager.
2192 if (!TheASTReader)
2193 return nullptr;
2194 // Get an existing global index. This loads it if not already
2195 // loaded.
2196 TheASTReader->loadGlobalIndex();
2197 GlobalModuleIndex *GlobalIndex = TheASTReader->getGlobalIndex();
2198 // If the global index doesn't exist, create it.
2199 if (!GlobalIndex && shouldBuildGlobalModuleIndex() && hasFileManager() &&
2200 hasPreprocessor()) {
2201 llvm::sys::fs::create_directories(
2202 getPreprocessor().getHeaderSearchInfo().getSpecificModuleCachePath());
2203 if (llvm::Error Err = GlobalModuleIndex::writeIndex(
2206 .getHeaderSearchInfo()
2208 // FIXME this drops the error on the floor. This code is only used for
2209 // typo correction and drops more than just this one source of errors
2210 // (such as the directory creation failure above). It should handle the
2211 // error.
2212 consumeError(std::move(Err));
2213 return nullptr;
2214 }
2215 TheASTReader->resetForReload();
2216 TheASTReader->loadGlobalIndex();
2217 GlobalIndex = TheASTReader->getGlobalIndex();
2218 }
2219 // For finding modules needing to be imported for fixit messages,
2220 // we need to make the global index cover all modules, so we do that here.
2221 if (!HaveFullGlobalModuleIndex && GlobalIndex && !buildingModule()) {
2223 bool RecreateIndex = false;
2225 E = MMap.module_end(); I != E; ++I) {
2226 Module *TheModule = I->second;
2227 OptionalFileEntryRef Entry = TheModule->getASTFile();
2228 if (!Entry) {
2230 Path.emplace_back(TriggerLoc,
2231 getPreprocessor().getIdentifierInfo(TheModule->Name));
2232 std::reverse(Path.begin(), Path.end());
2233 // Load a module as hidden. This also adds it to the global index.
2234 loadModule(TheModule->DefinitionLoc, Path, Module::Hidden, false);
2235 RecreateIndex = true;
2236 }
2237 }
2238 if (RecreateIndex) {
2239 if (llvm::Error Err = GlobalModuleIndex::writeIndex(
2242 .getHeaderSearchInfo()
2244 // FIXME As above, this drops the error on the floor.
2245 consumeError(std::move(Err));
2246 return nullptr;
2247 }
2248 TheASTReader->resetForReload();
2249 TheASTReader->loadGlobalIndex();
2250 GlobalIndex = TheASTReader->getGlobalIndex();
2251 }
2252 HaveFullGlobalModuleIndex = true;
2253 }
2254 return GlobalIndex;
2255}
2256
2257// Check global module index for missing imports.
2258bool
2260 SourceLocation TriggerLoc) {
2261 // Look for the symbol in non-imported modules, but only if an error
2262 // actually occurred.
2263 if (!buildingModule()) {
2264 // Load global module index, or retrieve a previously loaded one.
2266 TriggerLoc);
2267
2268 // Only if we have a global index.
2269 if (GlobalIndex) {
2270 GlobalModuleIndex::HitSet FoundModules;
2271
2272 // Find the modules that reference the identifier.
2273 // Note that this only finds top-level modules.
2274 // We'll let diagnoseTypo find the actual declaration module.
2275 if (GlobalIndex->lookupIdentifier(Name, FoundModules))
2276 return true;
2277 }
2278 }
2279
2280 return false;
2281}
2282void CompilerInstance::resetAndLeakSema() { llvm::BuryPointer(takeSema()); }
2283
2286 ExternalSemaSrc = std::move(ESS);
2287}
Defines the clang::ASTContext interface.
Defines the Diagnostic-related interfaces.
static void collectVFSEntries(CompilerInstance &CI, std::shared_ptr< ModuleDependencyCollector > MDC)
static bool EnableCodeCompletion(Preprocessor &PP, StringRef Filename, unsigned Line, unsigned Column)
static bool compileModuleAndReadASTImpl(CompilerInstance &ImportingInstance, SourceLocation ImportLoc, SourceLocation ModuleNameLoc, Module *Module, StringRef ModuleFileName)
Compile a module in a separate compiler instance and read the AST, returning true if the module compi...
static void SetupSerializedDiagnostics(DiagnosticOptions &DiagOpts, DiagnosticsEngine &Diags, StringRef OutputFile)
static bool compileModuleAndReadASTBehindLock(CompilerInstance &ImportingInstance, SourceLocation ImportLoc, SourceLocation ModuleNameLoc, Module *Module, StringRef ModuleFileName)
Compile a module in a separate compiler instance and read the AST, returning true if the module compi...
static Language getLanguageFromOptions(const LangOptions &LangOpts)
Determine the appropriate source input kind based on language options.
static void checkConfigMacro(Preprocessor &PP, StringRef ConfigMacro, Module *Mod, SourceLocation ImportLoc)
Diagnose differences between the current definition of the given configuration macro and the definiti...
static void collectHeaderMaps(const HeaderSearch &HS, std::shared_ptr< ModuleDependencyCollector > MDC)
static ModuleSource selectModuleSource(Module *M, StringRef ModuleName, std::string &ModuleFilename, const std::map< std::string, std::string, std::less<> > &BuiltModules, HeaderSearch &HS)
Select a source for loading the named module and compute the filename to load it from.
static bool readASTAfterCompileModule(CompilerInstance &ImportingInstance, SourceLocation ImportLoc, SourceLocation ModuleNameLoc, Module *Module, StringRef ModuleFileName, bool *OutOfDate, bool *Missing)
Read the AST right after compiling the module.
static void InitializeFileRemapping(DiagnosticsEngine &Diags, SourceManager &SourceMgr, FileManager &FileMgr, const PreprocessorOptions &InitOpts)
static void collectIncludePCH(CompilerInstance &CI, std::shared_ptr< ModuleDependencyCollector > MDC)
static OptionalFileEntryRef getPublicModuleMap(FileEntryRef File, FileManager &FileMgr)
static void checkConfigMacros(Preprocessor &PP, Module *M, SourceLocation ImportLoc)
static bool compileModuleAndReadAST(CompilerInstance &ImportingInstance, SourceLocation ImportLoc, SourceLocation ModuleNameLoc, Module *Module, StringRef ModuleFileName)
Compile a module in a separate compiler instance and read the AST, returning true if the module compi...
static void SetUpDiagnosticLog(DiagnosticOptions &DiagOpts, const CodeGenOptions *CodeGenOpts, DiagnosticsEngine &Diags)
Defines the clang::FileManager interface and associated types.
Defines the clang::FrontendAction interface and various convenience abstract classes (clang::ASTFront...
Defines the clang::Preprocessor interface.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines the SourceManager interface.
Defines utilities for dealing with stack allocation and stack space.
Defines version macros and version-related utility functions for Clang.
virtual void Initialize(ASTContext &Context)
Initialize - This is called to initialize the consumer, providing the ASTContext.
Definition ASTConsumer.h:49
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:220
void setASTMutationListener(ASTMutationListener *Listener)
Attach an AST mutation listener to the AST context.
void setExternalSource(IntrusiveRefCntPtr< ExternalASTSource > Source)
Attach an external AST source to the AST context.
void ExecuteAction() override
Implement the ExecuteAction interface by running Sema on the already-initialized AST consumer.
Abstract interface for callback invocations by the ASTReader.
Definition ASTReader.h:117
RAII object to temporarily add an AST callback listener.
Definition ASTReader.h:1921
@ ARR_Missing
The client can handle an AST file that cannot load because it is missing.
Definition ASTReader.h:1834
@ ARR_None
The client can't handle any AST loading failures.
Definition ASTReader.h:1830
@ ARR_ConfigurationMismatch
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
Definition ASTReader.h:1847
@ ARR_OutOfDate
The client can handle an AST file that cannot load because it is out-of-date relative to its input fi...
Definition ASTReader.h:1838
@ ARR_TreatModuleWithErrorsAsOutOfDate
If a module file is marked with errors treat it as out-of-date so the caller can rebuild it.
Definition ASTReader.h:1851
static bool readASTFileControlBlock(StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache, const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions, ASTReaderListener &Listener, bool ValidateDiagnosticOptions, unsigned ClientLoadCapabilities=ARR_ConfigurationMismatch|ARR_OutOfDate)
Read the control block for the named AST file.
ASTReadResult
The result of reading the control block of an AST file, which can fail for various reasons.
Definition ASTReader.h:450
@ Success
The control block was read successfully.
Definition ASTReader.h:453
@ ConfigurationMismatch
The AST file was written with a different language/target configuration.
Definition ASTReader.h:470
@ OutOfDate
The AST file is out-of-date relative to its input files, and needs to be regenerated.
Definition ASTReader.h:463
@ Failure
The AST file itself appears corrupted.
Definition ASTReader.h:456
@ VersionMismatch
The AST file was written by a different version of Clang.
Definition ASTReader.h:466
@ HadErrors
The AST file has errors.
Definition ASTReader.h:473
@ Missing
The AST file was missing.
Definition ASTReader.h:459
ChainedDiagnosticConsumer - Chain two diagnostic clients so that diagnostics go to the first client a...
Abstract interface for a consumer of code-completion information.
Options controlling the behavior of code completion.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
std::string DwarfDebugFlags
The string to embed in the debug information for the compile unit, if non-empty.
CompilerInstance - Helper class for managing a single instance of the Clang compiler.
void createPCHExternalASTSource(StringRef Path, DisableValidationForModuleKind DisableValidation, bool AllowPCHWithCompilerErrors, void *DeserializationListener, bool OwnDeserializationListener)
Create an external AST source to read a PCH file and attach it to the AST context.
DiagnosticConsumer & getDiagnosticClient() const
void createPreprocessor(TranslationUnitKind TUKind)
Create the preprocessor, using the invocation, file, and source managers, and replace any existing on...
bool lookupMissingImports(StringRef Name, SourceLocation TriggerLoc) override
Check global module index for missing imports.
void setOutputManager(IntrusiveRefCntPtr< llvm::vfs::OutputBackend > NewOutputs)
Set the output manager.
void createDiagnostics(DiagnosticConsumer *Client=nullptr, bool ShouldOwnClient=true)
Create the diagnostics engine using the invocation's diagnostic options and replace any existing one ...
DependencyOutputOptions & getDependencyOutputOpts()
TargetInfo * getAuxTarget() const
const PCHContainerReader & getPCHContainerReader() const
Return the appropriate PCHContainerReader depending on the current CodeGenOptions.
DiagnosticsEngine & getDiagnostics() const
Get the current diagnostics engine.
GlobalModuleIndex * loadGlobalModuleIndex(SourceLocation TriggerLoc) override
Load, create, or return global module.
raw_ostream & getVerboseOutputStream()
Get the current stream for verbose output.
std::unique_ptr< raw_pwrite_stream > createDefaultOutputFile(bool Binary=true, StringRef BaseInput="", StringRef Extension="", bool RemoveFileOnSignal=true, bool CreateMissingDirectories=false, bool ForceUseTemporary=false)
Create the default output file (from the invocation's options) and add it to the list of tracked outp...
void setExternalSemaSource(IntrusiveRefCntPtr< ExternalSemaSource > ESS)
bool compileModule(SourceLocation ImportLoc, StringRef ModuleName, StringRef ModuleFileName, CompilerInstance &Instance)
Compile a module file for the given module, using the options provided by the importing compiler inst...
std::string getSpecificModuleCachePath()
ModuleLoadResult loadModule(SourceLocation ImportLoc, ModuleIdPath Path, Module::NameVisibilityKind Visibility, bool IsInclusionDirective) override
Attempt to load the given module.
FileSystemOptions & getFileSystemOpts()
bool InitializeSourceManager(const FrontendInputFile &Input)
InitializeSourceManager - Initialize the source manager to set InputFile as the main file.
void createFileManager()
Create the file manager and replace any existing one with it.
FileManager & getFileManager() const
Return the current file manager to the caller.
void setBuildGlobalModuleIndex(bool Build)
Set the flag indicating whether we should (re)build the global module index.
void createOutputManager()
Create an output manager.
std::unique_ptr< Sema > takeSema()
void printDiagnosticStats()
At the end of a compilation, print the number of warnings/errors.
void setASTConsumer(std::unique_ptr< ASTConsumer > Value)
setASTConsumer - Replace the current AST consumer; the compiler instance takes ownership of Value.
PreprocessorOutputOptions & getPreprocessorOutputOpts()
IntrusiveRefCntPtr< FileManager > getFileManagerPtr() const
ModuleCache & getModuleCache() const
IntrusiveRefCntPtr< ASTReader > getASTReader() const
void setTarget(TargetInfo *Value)
Replace the current Target.
void setModuleDepCollector(std::shared_ptr< ModuleDependencyCollector > Collector)
void addDependencyCollector(std::shared_ptr< DependencyCollector > Listener)
void createASTContext()
Create the AST context.
std::unique_ptr< raw_pwrite_stream > createOutputFile(StringRef OutputPath, bool Binary, bool RemoveFileOnSignal, bool UseTemporary, bool CreateMissingDirectories=false)
Create a new output file, optionally deriving the output path name, and add it to the list of tracked...
void createModuleFromSource(SourceLocation ImportLoc, StringRef ModuleName, StringRef Source) override
Attempt to create the given module from the specified source buffer.
Preprocessor & getPreprocessor() const
Return the current preprocessor.
ASTContext & getASTContext() const
IntrusiveRefCntPtr< llvm::vfs::FileSystem > getVirtualFileSystemPtr() const
void LoadRequestedPlugins()
Load the list of plugins requested in the FrontendOptions.
TargetOptions & getTargetOpts()
void createVirtualFileSystem(IntrusiveRefCntPtr< llvm::vfs::FileSystem > BaseFS=llvm::vfs::getRealFileSystem(), DiagnosticConsumer *DC=nullptr)
Create a virtual file system instance based on the invocation.
void setASTReader(IntrusiveRefCntPtr< ASTReader > Reader)
FrontendOptions & getFrontendOpts()
std::shared_ptr< ModuleDependencyCollector > getModuleDepCollector() const
void setSema(Sema *S)
Replace the current Sema; the compiler instance takes ownership of S.
std::unique_ptr< CompilerInstance > cloneForModuleCompile(SourceLocation ImportLoc, const Module *Module, StringRef ModuleFileName, std::optional< ThreadSafeCloneConfig > ThreadSafeConfig=std::nullopt)
Creates a new CompilerInstance for compiling a module.
void setSourceManager(llvm::IntrusiveRefCntPtr< SourceManager > Value)
setSourceManager - Replace the current source manager.
void setASTContext(llvm::IntrusiveRefCntPtr< ASTContext > Value)
setASTContext - Replace the current AST context.
HeaderSearchOptions & getHeaderSearchOpts()
void createFrontendTimer()
Create the frontend timer and replace any existing one with it.
void createSourceManager()
Create the source manager and replace any existing one with it.
CompilerInvocation & getInvocation()
void setVerboseOutputStream(raw_ostream &Value)
Replace the current stream for verbose output.
PreprocessorOptions & getPreprocessorOpts()
ASTConsumer & getASTConsumer() const
void setFileManager(IntrusiveRefCntPtr< FileManager > Value)
Replace the current file manager.
TargetInfo & getTarget() const
llvm::vfs::OutputBackend & getOutputManager()
llvm::vfs::FileSystem & getVirtualFileSystem() const
void createCodeCompletionConsumer()
Create a code completion consumer using the invocation; note that this will cause the source manager ...
void setCodeCompletionConsumer(CodeCompleteConsumer *Value)
setCodeCompletionConsumer - Replace the current code completion consumer; the compiler instance takes...
bool ExecuteAction(FrontendAction &Act)
ExecuteAction - Execute the provided action against the compiler's CompilerInvocation object.
std::shared_ptr< PCHContainerOperations > getPCHContainerOperations() const
void clearOutputFiles(bool EraseFiles)
clearOutputFiles - Clear the output file list.
DiagnosticOptions & getDiagnosticOpts()
llvm::vfs::OutputBackend & getOrCreateOutputManager()
CodeGenOptions & getCodeGenOpts()
SourceManager & getSourceManager() const
Return the current source manager.
void setDiagnostics(llvm::IntrusiveRefCntPtr< DiagnosticsEngine > Value)
setDiagnostics - Replace the current diagnostics engine.
bool shouldBuildGlobalModuleIndex() const
Indicates whether we should (re)build the global module index.
APINotesOptions & getAPINotesOpts()
std::unique_ptr< raw_pwrite_stream > createNullOutputFile()
void setAuxTarget(TargetInfo *Value)
Replace the current AuxTarget.
void makeModuleVisible(Module *Mod, Module::NameVisibilityKind Visibility, SourceLocation ImportLoc) override
Make the given module visible.
bool loadModuleFile(StringRef FileName, serialization::ModuleFile *&LoadedModuleFile)
void setPreprocessor(std::shared_ptr< Preprocessor > Value)
Replace the current preprocessor.
void createSema(TranslationUnitKind TUKind, CodeCompleteConsumer *CompletionConsumer)
Create the Sema object to be used for parsing.
LangOptions & getLangOpts()
Mutable getters.
FrontendOptions & getFrontendOpts()
std::string computeContextHash() const
Compute the context hash - a string that uniquely identifies compiler settings.
DependencyOutputOptions - Options for controlling the compiler dependency file generation.
ShowIncludesDestination ShowIncludesDest
Destination of cl.exe style /showIncludes info.
std::string DOTOutputFile
The file to write GraphViz-formatted header dependencies to.
std::string ModuleDependencyOutputDir
The directory to copy module dependencies to when collecting them.
std::string OutputFile
The file to write dependency output to.
std::string HeaderIncludeOutputFile
The file to write header include output to.
unsigned ShowHeaderIncludes
Show header inclusions (-H).
Abstract interface, implemented by clients of the front-end, which formats and prints fully processed...
unsigned getNumErrors() const
virtual void finish()
Callback to inform the diagnostic client that processing of all source files has ended.
unsigned getNumWarnings() const
static llvm::IntrusiveRefCntPtr< DiagnosticIDs > create()
Options for controlling the compiler diagnostics engine.
std::string DiagnosticLogFile
The file to log diagnostic output to.
std::vector< std::string > SystemHeaderWarningsModules
The list of -Wsystem-headers-in-module=... options used to override whether -Wsystem-headers is enabl...
std::string DiagnosticSerializationFile
The file to serialize diagnostics to (non-appending).
Concrete class used by the front-end to report problems and issues.
Definition Diagnostic.h:232
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
bool hasErrorOccurred() const
Definition Diagnostic.h:872
void setClient(DiagnosticConsumer *client, bool ShouldOwnClient=true)
Set the diagnostic client associated with this diagnostic object.
std::unique_ptr< DiagnosticConsumer > takeClient()
Return the current diagnostic client along with ownership of that client.
Definition Diagnostic.h:615
DiagnosticConsumer * getClient()
Definition Diagnostic.h:607
Level getDiagnosticLevel(unsigned DiagID, SourceLocation Loc) const
Based on the way the client configured the DiagnosticsEngine object, classify the specified diagnosti...
Definition Diagnostic.h:966
bool ownsClient() const
Determine whether this DiagnosticsEngine object own its client.
Definition Diagnostic.h:611
StringRef getName() const
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
Definition FileEntry.h:57
off_t getSize() const
Definition FileEntry.h:346
StringRef getName() const
The name of this FileEntry.
Definition FileEntry.h:61
StringRef getNameAsRequested() const
The name of this FileEntry, as originally requested without applying any remappings for VFS 'use-exte...
Definition FileEntry.h:68
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
bool isValid() const
bool isInvalid() const
Implements support for file system lookup, file system caching, and directory search management.
Definition FileManager.h:53
void AddStats(const FileManager &Other)
Import statistics from a child FileManager and add them to this current FileManager.
OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true)
Get a FileEntryRef if it exists, without doing anything on error.
void PrintStats() const
static bool fixupRelativePath(const FileSystemOptions &FileSystemOpts, SmallVectorImpl< char > &Path)
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
Definition Diagnostic.h:140
Abstract base class for actions which can be performed by the frontend.
virtual void EndSourceFile()
Perform any per-file post processing, deallocate per-file objects, and run statistics and output file...
bool PrepareToExecute(CompilerInstance &CI)
Prepare the action to execute on the given compiler instance.
llvm::Error Execute()
Set the source manager's main input file, and run the action.
bool BeginSourceFile(CompilerInstance &CI, const FrontendInputFile &Input)
Prepare the action for processing the input file Input.
virtual bool isModelParsingAction() const
Is this action invoked on a model file?
An input file for the front end.
llvm::MemoryBufferRef getBuffer() const
InputKind getKind() const
StringRef getFile() const
FrontendOptions - Options for controlling the behavior of the frontend.
unsigned BuildingImplicitModule
Whether we are performing an implicit module build.
unsigned AllowPCMWithCompilerErrors
Output (and read) PCM files regardless of compiler errors.
unsigned BuildingImplicitModuleUsesLock
Whether to use a filesystem lock when building implicit modules.
unsigned ModulesShareFileManager
Whether to share the FileManager when building modules.
std::optional< std::string > AuxTargetCPU
Auxiliary target CPU for CUDA/HIP compilation.
std::string StatsFile
Filename to write statistics to.
std::string OutputFile
The output file, if any.
std::string ActionName
The name of the action to run when using a plugin action.
ParsedSourceLocation CodeCompletionAt
If given, enable code completion at the provided location.
std::string OriginalModuleMap
When the input is a module map, the original module map file from which that map was inferred,...
unsigned GenerateGlobalModuleIndex
Whether we can generate the global module index if needed.
unsigned DisableFree
Disable memory freeing on exit.
SmallVector< FrontendInputFile, 0 > Inputs
The input files and their types.
frontend::ActionKind ProgramAction
The frontend action to perform.
std::optional< std::vector< std::string > > AuxTargetFeatures
Auxiliary target features for CUDA/HIP compilation.
A global index for a set of module files, providing information about the identifiers within those mo...
llvm::SmallPtrSet< ModuleFile *, 4 > HitSet
A set of module files in which we found a result.
bool lookupIdentifier(llvm::StringRef Name, HitSet &Hits)
Look for all of the module files with information about the given identifier, e.g....
static llvm::Error writeIndex(FileManager &FileMgr, const PCHContainerReader &PCHContainerRdr, llvm::StringRef Path)
Write a global index into the given.
HeaderSearchOptions - Helper class for storing options related to the initialization of the HeaderSea...
unsigned ModulesForceValidateUserHeaders
Whether to force the validation of user input files when a module is loaded (even despite the build s...
std::map< std::string, std::string, std::less<> > PrebuiltModuleFiles
The mapping of module names to prebuilt module files.
std::vector< std::string > PrebuiltModulePaths
The directories used to load prebuilt module files.
unsigned ModulesValidateSystemHeaders
Whether to validate system input files when a module is loaded.
unsigned EnablePrebuiltImplicitModules
Also search for prebuilt implicit modules in the prebuilt module cache path.
std::string Sysroot
If non-empty, the directory to use as a "virtual system root" for include paths.
unsigned ModulesValidateOncePerBuildSession
If true, skip verifying input files used by modules if the module was already verified during this bu...
Encapsulates the information needed to find the file referenced by a #include or #include_next,...
Module * lookupModule(StringRef ModuleName, SourceLocation ImportLoc=SourceLocation(), bool AllowSearch=true, bool AllowExtraModuleMapSearch=false)
Lookup a module Search for a module with the given name.
void getHeaderMapFileNames(SmallVectorImpl< std::string > &Names) const
Get filenames for all registered header maps.
std::string getPrebuiltImplicitModuleFileName(Module *Module)
Retrieve the name of the prebuilt module file that should be used to load the given module.
const HeaderSearchOptions & getHeaderSearchOpts() const
Retrieve the header-search options with which this header search was initialized.
std::string getCachedModuleFileName(Module *Module)
Retrieve the name of the cached module file that should be used to load the given module.
ModuleMap & getModuleMap()
Retrieve the module map.
std::string getPrebuiltModuleFileName(StringRef ModuleName, bool FileMapOnly=false)
Retrieve the name of the prebuilt module file that should be used to load a module with the given nam...
One of these records is kept for each identifier that is lexed.
bool hadMacroDefinition() const
Returns true if this identifier was #defined to some value at any moment.
The kind of a file that we've been handed as an input.
Format getFormat() const
@ FPE_Default
Used internally to represent initial unspecified value.
@ FPE_Ignore
Assume that floating-point exceptions are masked.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
std::string ModuleName
The module currently being compiled as specified by -fmodule-name.
Encapsulates the data about a macro definition (e.g.
Definition MacroInfo.h:39
The module cache used for compiling modules implicitly.
Definition ModuleCache.h:25
virtual void prepareForGetLock(StringRef ModuleFilename)=0
May perform any work that only needs to be performed once for multiple calls getLock() with the same ...
virtual void updateModuleTimestamp(StringRef ModuleFilename)=0
Updates the timestamp denoting the last time inputs of the module file were validated.
virtual std::unique_ptr< llvm::AdvisoryLock > getLock(StringRef ModuleFilename)=0
Returns lock for the given module file. The lock is initially unlocked.
Describes the result of attempting to load a module.
bool buildingModule() const
Returns true if this instance is building a module.
ModuleLoader(bool BuildingModule=false)
llvm::StringMap< Module * >::const_iterator module_iterator
Definition ModuleMap.h:745
module_iterator module_begin() const
Definition ModuleMap.h:747
OptionalFileEntryRef getModuleMapFileForUniquing(const Module *M) const
std::optional< Module * > getCachedModuleLoad(const IdentifierInfo &II)
Return a cached module load.
Definition ModuleMap.h:759
module_iterator module_end() const
Definition ModuleMap.h:748
FileID getContainingModuleMapFileID(const Module *Module) const
Retrieve the module map file containing the definition of the given module.
void resolveLinkAsDependencies(Module *Mod)
Use PendingLinkAsModule information to mark top level link names that are going to be replaced by exp...
Definition ModuleMap.cpp:51
void cacheModuleLoad(const IdentifierInfo &II, Module *M)
Cache a module load. M might be nullptr.
Definition ModuleMap.h:754
Module * findOrLoadModule(StringRef Name)
Describes a module or submodule.
Definition Module.h:144
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
Definition Module.h:732
Module * findSubmodule(StringRef Name) const
Find the submodule with the given name.
Definition Module.cpp:350
std::vector< std::string > ConfigMacros
The set of "configuration macros", which are macros that (intentionally) change how this module is bu...
Definition Module.h:528
unsigned IsUnimportable
Whether this module has declared itself unimportable, either because it's missing a requirement from ...
Definition Module.h:361
NameVisibilityKind
Describes the visibility of the various names within a particular module.
Definition Module.h:443
@ Hidden
All of the names in this module are hidden.
Definition Module.h:445
void print(raw_ostream &OS, unsigned Indent=0, bool Dump=false) const
Print the module map for this module to the given stream.
Definition Module.cpp:463
SourceLocation DefinitionLoc
The location of the module definition.
Definition Module.h:150
unsigned IsSystem
Whether this is a "system" module (which assumes that all headers in it are system headers).
Definition Module.h:389
std::string Name
The name of this module.
Definition Module.h:147
llvm::iterator_range< submodule_iterator > submodules()
Definition Module.h:838
OptionalDirectoryEntryRef Directory
The build directory of this module.
Definition Module.h:198
unsigned IsFromModuleFile
Whether this module was loaded from a module file.
Definition Module.h:376
unsigned HasIncompatibleModuleFile
Whether we tried and failed to load a module file for this module.
Definition Module.h:365
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
Definition Module.cpp:239
unsigned IsAvailable
Whether this module is available in the current translation unit.
Definition Module.h:372
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
Definition Module.h:722
OptionalFileEntryRef getASTFile() const
The serialized AST file for this module, if one was created.
Definition Module.h:737
This abstract interface provides operations for unwrapping containers for serialized ASTs (precompile...
@ ReplaceAction
Replace the main action.
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::pair< std::string, std::string > > RemappedFiles
The set of file remappings, which take existing files on the system (the first part of each pair) and...
std::pair< unsigned, bool > PrecompiledPreambleBytes
If non-zero, the implicit PCH include is actually a precompiled preamble that covers this number of b...
bool RemappedFilesKeepOriginalName
True if the SourceManager should report the original file name for contents of files that were remapp...
bool RetainRemappedFileBuffers
Whether the compiler instance should retain (i.e., not free) the buffers associated with remapped fil...
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
std::string ImplicitPCHInclude
The implicit PCH included at the start of the translation unit, or empty.
DisableValidationForModuleKind DisablePCHOrModuleValidation
Whether to disable most of the normal validation performed on precompiled headers and module files.
std::vector< std::pair< std::string, bool > > Macros
std::vector< std::pair< std::string, llvm::MemoryBuffer * > > RemappedFileBuffers
The set of file-to-buffer remappings, which take existing files on the system (the first part of each...
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
const MacroInfo * getMacroInfo(const IdentifierInfo *II) const
MacroDirective * getLocalMacroDirectiveHistory(const IdentifierInfo *II) const
Given an identifier, return the latest non-imported macro directive for that identifier.
bool SetCodeCompletionPoint(FileEntryRef File, unsigned Line, unsigned Column)
Specify the point at which code-completion will be performed.
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
SourceManager & getSourceManager() const
static bool checkModuleIsAvailable(const LangOptions &LangOpts, const TargetInfo &TargetInfo, const Module &M, DiagnosticsEngine &Diags)
Check that the given module is available, producing a diagnostic if not.
FileID getPCHPredefinesFileID() const
Returns the FileID for the predefines loaded from the PCH.
FileManager & getFileManager() const
FileID getPredefinesFileID() const
Returns the FileID for the preprocessor predefines.
HeaderSearch & getHeaderSearchInfo() const
DiagnosticsEngine & getDiagnostics() const
DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) const
Forwarding function for diagnostics.
A simple code-completion consumer that prints the results it receives in a simple format.
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:855
ASTReaderListenter implementation to set SuggestedPredefines of ASTReader which is required to use a ...
Definition ASTReader.h:362
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
ModuleBuildStack getModuleBuildStack() const
Retrieve the module build stack.
A trivial tuple used to represent a source range.
CharacteristicKind getFileCharacteristic() const
Return whether this is a system header or not.
This is a discriminated union of FileInfo and ExpansionInfo.
const FileInfo & getFile() const
Exposes information about the current target.
Definition TargetInfo.h:226
static TargetInfo * CreateTargetInfo(DiagnosticsEngine &Diags, TargetOptions &Opts)
Construct a target for the given options.
Definition Targets.cpp:806
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual void setAuxTarget(const TargetInfo *Aux)
void noSignedCharForObjCBool()
Definition TargetInfo.h:941
virtual void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, const TargetInfo *Aux)
Set forced language options.
std::string CPU
If given, the name of the target CPU to generate code for.
VerifyDiagnosticConsumer - Create a diagnostic client which will use markers in the input source to c...
Information about a module that has been loaded by the ASTReader.
Definition ModuleFile.h:130
Defines the clang::TargetInfo interface.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
@ HeaderSearch
Remove unused header search paths including header maps.
@ PluginAction
Run a plugin action,.
@ RewriteObjC
ObjC->C Rewriter.
bool Inv(InterpState &S, CodePtr OpPC)
Definition Interp.h:643
@ MK_PCH
File is a PCH file treated as such.
Definition ModuleFile.h:51
@ MK_Preamble
File is a PCH file treated as the preamble.
Definition ModuleFile.h:54
@ MK_ExplicitModule
File is an explicitly-loaded module.
Definition ModuleFile.h:48
@ MK_ImplicitModule
File is an implicitly-loaded module.
Definition ModuleFile.h:45
@ MK_PrebuiltModule
File is from a prebuilt module path.
Definition ModuleFile.h:60
std::unique_ptr< DiagnosticConsumer > create(StringRef OutputFile, DiagnosticOptions &DiagOpts, bool MergeChildRecords=false)
Returns a DiagnosticConsumer that serializes diagnostics to a bitcode file.
The JSON file list parser is used to communicate input to InstallAPI.
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
Definition FileEntry.h:208
ArrayRef< IdentifierLoc > ModuleIdPath
A sequence of identifier/location pairs used to describe a particular module or submodule,...
ArrayRef< std::pair< std::string, FullSourceLoc > > ModuleBuildStack
The stack used when building modules on demand, which is used to provide a link between the source ma...
void ApplyHeaderSearchOptions(HeaderSearch &HS, const HeaderSearchOptions &HSOpts, const LangOptions &Lang, const llvm::Triple &triple)
Apply the header search options to get given HeaderSearch object.
@ Success
Annotation was successful.
Definition Parser.h:65
std::shared_ptr< ModuleCache > createCrossProcessModuleCache()
Creates new ModuleCache backed by a file system directory that may be operated on by multiple process...
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
void InitializePreprocessor(Preprocessor &PP, const PreprocessorOptions &PPOpts, const PCHContainerReader &PCHContainerRdr, const FrontendOptions &FEOpts, const CodeGenOptions &CodeGenOpts)
InitializePreprocessor - Initialize the preprocessor getting it and the environment ready to process ...
LLVM_READONLY bool isAlphanumeric(unsigned char c)
Return true if this character is an ASCII letter or digit: [a-zA-Z0-9].
Definition CharInfo.h:138
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
Definition Linkage.h:54
Language
The language for the input, used to select and validate the language standard and possible actions.
@ C
Languages that the frontend can parse and compile.
@ Result
The result type of a method or function.
Definition TypeBase.h:905
IntrusiveRefCntPtr< llvm::vfs::FileSystem > createVFSFromCompilerInvocation(const CompilerInvocation &CI, DiagnosticsEngine &Diags)
void normalizeModuleCachePath(FileManager &FileMgr, StringRef Path, SmallVectorImpl< char > &NormalizedPath)
constexpr size_t DesiredStackSize
The amount of stack space that Clang would like to be provided with.
Definition Stack.h:26
void noteBottomOfStack(bool ForceSet=false)
Call this once on each thread, as soon after starting the thread as feasible, to note the approximate...
Definition Stack.cpp:20
void ProcessWarningOptions(DiagnosticsEngine &Diags, const DiagnosticOptions &Opts, llvm::vfs::FileSystem &VFS, bool ReportDiags=true)
ProcessWarningOptions - Initialize the diagnostic client and process the warning options specified on...
Definition Warnings.cpp:46
TranslationUnitKind
Describes the kind of translation unit being processed.
void AttachHeaderIncludeGen(Preprocessor &PP, const DependencyOutputOptions &DepOpts, bool ShowAllHeaders=false, StringRef OutputPath={}, bool ShowDepth=true, bool MSStyle=false)
AttachHeaderIncludeGen - Create a header include list generator, and attach it to the given preproces...
DisableValidationForModuleKind
Whether to disable the normal validation performed on precompiled headers and module files when they ...
@ Other
Other implicit parameter.
Definition Decl.h:1746
Visibility
Describes the different kinds of visibility that a declaration may have.
Definition Visibility.h:34
void AttachDependencyGraphGen(Preprocessor &PP, StringRef OutputFile, StringRef SysRoot)
AttachDependencyGraphGen - Create a dependency graph generator, and attach it to the given preprocess...
A source location that has been parsed on the command line.