Thanks to visit codestin.com
Credit goes to clang.llvm.org

clang 22.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"
19#include "clang/Basic/Stack.h"
21#include "clang/Basic/Version.h"
22#include "clang/Config/config.h"
39#include "clang/Sema/Sema.h"
44#include "llvm/ADT/IntrusiveRefCntPtr.h"
45#include "llvm/ADT/STLExtras.h"
46#include "llvm/ADT/ScopeExit.h"
47#include "llvm/ADT/Statistic.h"
48#include "llvm/Config/llvm-config.h"
49#include "llvm/Support/AdvisoryLock.h"
50#include "llvm/Support/BuryPointer.h"
51#include "llvm/Support/CrashRecoveryContext.h"
52#include "llvm/Support/Errc.h"
53#include "llvm/Support/FileSystem.h"
54#include "llvm/Support/MemoryBuffer.h"
55#include "llvm/Support/Path.h"
56#include "llvm/Support/Signals.h"
57#include "llvm/Support/TimeProfiler.h"
58#include "llvm/Support/Timer.h"
59#include "llvm/Support/VirtualFileSystem.h"
60#include "llvm/Support/VirtualOutputBackends.h"
61#include "llvm/Support/VirtualOutputError.h"
62#include "llvm/Support/raw_ostream.h"
63#include "llvm/TargetParser/Host.h"
64#include <optional>
65#include <time.h>
66#include <utility>
67
68using namespace clang;
69
70CompilerInstance::CompilerInstance(
71 std::shared_ptr<CompilerInvocation> Invocation,
72 std::shared_ptr<PCHContainerOperations> PCHContainerOps,
73 ModuleCache *ModCache)
74 : ModuleLoader(/*BuildingModule=*/ModCache),
75 Invocation(std::move(Invocation)),
76 ModCache(ModCache ? ModCache : createCrossProcessModuleCache()),
77 ThePCHContainerOperations(std::move(PCHContainerOps)) {
78 assert(this->Invocation && "Invocation must not be null");
79}
80
82 assert(OutputFiles.empty() && "Still output files in flight?");
83}
84
86 return (BuildGlobalModuleIndex ||
87 (TheASTReader && TheASTReader->isGlobalIndexUnavailable() &&
88 getFrontendOpts().GenerateGlobalModuleIndex)) &&
89 !DisableGeneratingGlobalModuleIndex;
90}
91
96
98 OwnedVerboseOutputStream.reset();
99 VerboseOutputStream = &Value;
100}
101
102void CompilerInstance::setVerboseOutputStream(std::unique_ptr<raw_ostream> Value) {
103 OwnedVerboseOutputStream.swap(Value);
104 VerboseOutputStream = OwnedVerboseOutputStream.get();
105}
106
109
111 // Create the target instance.
114 if (!hasTarget())
115 return false;
116
117 // Check whether AuxTarget exists, if not, then create TargetInfo for the
118 // other side of CUDA/OpenMP/SYCL compilation.
119 if (!getAuxTarget() &&
120 (getLangOpts().CUDA || getLangOpts().isTargetDevice()) &&
121 !getFrontendOpts().AuxTriple.empty()) {
122 auto &TO = AuxTargetOpts = std::make_unique<TargetOptions>();
123 TO->Triple = llvm::Triple::normalize(getFrontendOpts().AuxTriple);
124 if (getFrontendOpts().AuxTargetCPU)
125 TO->CPU = *getFrontendOpts().AuxTargetCPU;
126 if (getFrontendOpts().AuxTargetFeatures)
127 TO->FeaturesAsWritten = *getFrontendOpts().AuxTargetFeatures;
128 TO->HostTriple = getTarget().getTriple().str();
130 }
131
132 if (!getTarget().hasStrictFP() && !getLangOpts().ExpStrictFP) {
133 if (getLangOpts().RoundingMath) {
134 getDiagnostics().Report(diag::warn_fe_backend_unsupported_fp_rounding);
135 getLangOpts().RoundingMath = false;
136 }
137 auto FPExc = getLangOpts().getFPExceptionMode();
138 if (FPExc != LangOptions::FPE_Default && FPExc != LangOptions::FPE_Ignore) {
139 getDiagnostics().Report(diag::warn_fe_backend_unsupported_fp_exceptions);
140 getLangOpts().setFPExceptionMode(LangOptions::FPE_Ignore);
141 }
142 // FIXME: can we disable FEnvAccess?
143 }
144
145 // We should do it here because target knows nothing about
146 // language options when it's being created.
147 if (getLangOpts().OpenCL &&
148 !getTarget().validateOpenCLTarget(getLangOpts(), getDiagnostics()))
149 return false;
150
151 // Inform the target of the language options.
152 // FIXME: We shouldn't need to do this, the target should be immutable once
153 // created. This complexity should be lifted elsewhere.
155
156 if (auto *Aux = getAuxTarget())
157 getTarget().setAuxTarget(Aux);
158
159 return true;
160}
161
164 setVirtualFileSystem(Value->getVirtualFileSystemPtr());
165 assert(Value == nullptr ||
166 getVirtualFileSystemPtr() == Value->getVirtualFileSystemPtr());
167 FileMgr = std::move(Value);
168}
169
174
175void CompilerInstance::setPreprocessor(std::shared_ptr<Preprocessor> Value) {
176 PP = std::move(Value);
177}
178
181 Context = std::move(Value);
182
183 if (Context && Consumer)
185}
186
188 TheSema.reset(S);
189}
190
191void CompilerInstance::setASTConsumer(std::unique_ptr<ASTConsumer> Value) {
192 Consumer = std::move(Value);
193
194 if (Context && Consumer)
196}
197
201
202std::unique_ptr<Sema> CompilerInstance::takeSema() {
203 return std::move(TheSema);
204}
205
207 return TheASTReader;
208}
210 assert(ModCache.get() == &Reader->getModuleManager().getModuleCache() &&
211 "Expected ASTReader to use the same PCM cache");
212 TheASTReader = std::move(Reader);
213}
214
215std::shared_ptr<ModuleDependencyCollector>
217 return ModuleDepCollector;
218}
219
221 std::shared_ptr<ModuleDependencyCollector> Collector) {
222 ModuleDepCollector = std::move(Collector);
223}
224
225static void collectHeaderMaps(const HeaderSearch &HS,
226 std::shared_ptr<ModuleDependencyCollector> MDC) {
227 SmallVector<std::string, 4> HeaderMapFileNames;
228 HS.getHeaderMapFileNames(HeaderMapFileNames);
229 for (auto &Name : HeaderMapFileNames)
230 MDC->addFile(Name);
231}
232
234 std::shared_ptr<ModuleDependencyCollector> MDC) {
235 const PreprocessorOptions &PPOpts = CI.getPreprocessorOpts();
236 if (PPOpts.ImplicitPCHInclude.empty())
237 return;
238
239 StringRef PCHInclude = PPOpts.ImplicitPCHInclude;
241 auto PCHDir = FileMgr.getOptionalDirectoryRef(PCHInclude);
242 if (!PCHDir) {
243 MDC->addFile(PCHInclude);
244 return;
245 }
246
247 std::error_code EC;
248 SmallString<128> DirNative;
249 llvm::sys::path::native(PCHDir->getName(), DirNative);
250 llvm::vfs::FileSystem &FS = FileMgr.getVirtualFileSystem();
252 for (llvm::vfs::directory_iterator Dir = FS.dir_begin(DirNative, EC), DirEnd;
253 Dir != DirEnd && !EC; Dir.increment(EC)) {
254 // Check whether this is an AST file. ASTReader::isAcceptableASTFile is not
255 // used here since we're not interested in validating the PCH at this time,
256 // but only to check whether this is a file containing an AST.
258 Dir->path(), FileMgr, CI.getModuleCache(),
260 /*FindModuleFileExtensions=*/false, Validator,
261 /*ValidateDiagnosticOptions=*/false))
262 MDC->addFile(Dir->path());
263 }
264}
265
267 std::shared_ptr<ModuleDependencyCollector> MDC) {
268 // Collect all VFS found.
270 CI.getVirtualFileSystem().visit([&](llvm::vfs::FileSystem &VFS) {
271 if (auto *RedirectingVFS = dyn_cast<llvm::vfs::RedirectingFileSystem>(&VFS))
272 llvm::vfs::collectVFSEntries(*RedirectingVFS, VFSEntries);
273 });
274
275 for (auto &E : VFSEntries)
276 MDC->addFile(E.VPath, E.RPath);
277}
278
281 DiagnosticOptions DiagOpts;
282 DiagnosticsEngine Diags(DiagnosticIDs::create(), DiagOpts, DC,
283 /*ShouldOwnClient=*/false);
284
286 std::move(BaseFS));
287 // FIXME: Should this go into createVFSFromCompilerInvocation?
288 if (getFrontendOpts().ShowStats)
289 VFS =
290 llvm::makeIntrusiveRefCnt<llvm::vfs::TracingFileSystem>(std::move(VFS));
291}
292
293// Diagnostics
295 const CodeGenOptions *CodeGenOpts,
296 DiagnosticsEngine &Diags) {
297 std::error_code EC;
298 std::unique_ptr<raw_ostream> StreamOwner;
299 raw_ostream *OS = &llvm::errs();
300 if (DiagOpts.DiagnosticLogFile != "-") {
301 // Create the output stream.
302 auto FileOS = std::make_unique<llvm::raw_fd_ostream>(
303 DiagOpts.DiagnosticLogFile, EC,
304 llvm::sys::fs::OF_Append | llvm::sys::fs::OF_TextWithCRLF);
305 if (EC) {
306 Diags.Report(diag::warn_fe_cc_log_diagnostics_failure)
307 << DiagOpts.DiagnosticLogFile << EC.message();
308 } else {
309 FileOS->SetUnbuffered();
310 OS = FileOS.get();
311 StreamOwner = std::move(FileOS);
312 }
313 }
314
315 // Chain in the diagnostic client which will log the diagnostics.
316 auto Logger = std::make_unique<LogDiagnosticPrinter>(*OS, DiagOpts,
317 std::move(StreamOwner));
318 if (CodeGenOpts)
319 Logger->setDwarfDebugFlags(CodeGenOpts->DwarfDebugFlags);
320 if (Diags.ownsClient()) {
321 Diags.setClient(
322 new ChainedDiagnosticConsumer(Diags.takeClient(), std::move(Logger)));
323 } else {
324 Diags.setClient(
325 new ChainedDiagnosticConsumer(Diags.getClient(), std::move(Logger)));
326 }
327}
328
330 DiagnosticsEngine &Diags,
331 StringRef OutputFile) {
332 auto SerializedConsumer =
333 clang::serialized_diags::create(OutputFile, DiagOpts);
334
335 if (Diags.ownsClient()) {
337 Diags.takeClient(), std::move(SerializedConsumer)));
338 } else {
340 Diags.getClient(), std::move(SerializedConsumer)));
341 }
342}
343
345 bool ShouldOwnClient) {
347 Client, ShouldOwnClient, &getCodeGenOpts());
348}
349
351 llvm::vfs::FileSystem &VFS, DiagnosticOptions &Opts,
352 DiagnosticConsumer *Client, bool ShouldOwnClient,
353 const CodeGenOptions *CodeGenOpts) {
354 auto Diags = llvm::makeIntrusiveRefCnt<DiagnosticsEngine>(
355 DiagnosticIDs::create(), Opts);
356
357 // Create the diagnostic client for reporting errors or for
358 // implementing -verify.
359 if (Client) {
360 Diags->setClient(Client, ShouldOwnClient);
361 } else if (Opts.getFormat() == DiagnosticOptions::SARIF) {
362 Diags->setClient(new SARIFDiagnosticPrinter(llvm::errs(), Opts));
363 } else
364 Diags->setClient(new TextDiagnosticPrinter(llvm::errs(), Opts));
365
366 // Chain in -verify checker, if requested.
367 if (Opts.VerifyDiagnostics)
368 Diags->setClient(new VerifyDiagnosticConsumer(*Diags));
369
370 // Chain in -diagnostic-log-file dumper, if requested.
371 if (!Opts.DiagnosticLogFile.empty())
372 SetUpDiagnosticLog(Opts, CodeGenOpts, *Diags);
373
374 if (!Opts.DiagnosticSerializationFile.empty())
376
377 // Configure our handling of diagnostics.
378 ProcessWarningOptions(*Diags, Opts, VFS);
379
380 return Diags;
381}
382
383// File Manager
384
386 assert(VFS && "CompilerInstance needs a VFS for creating FileManager");
387 FileMgr = llvm::makeIntrusiveRefCnt<FileManager>(getFileSystemOpts(), VFS);
388 return FileMgr.get();
389}
390
391// Source Manager
392
394 SourceMgr =
395 llvm::makeIntrusiveRefCnt<SourceManager>(getDiagnostics(), FileMgr);
396}
397
398// Initialize the remapping of files to alternative contents, e.g.,
399// those specified through other files.
401 SourceManager &SourceMgr,
403 const PreprocessorOptions &InitOpts) {
404 // Remap files in the source manager (with buffers).
405 for (const auto &RB : InitOpts.RemappedFileBuffers) {
406 // Create the file entry for the file that we're mapping from.
407 FileEntryRef FromFile =
408 FileMgr.getVirtualFileRef(RB.first, RB.second->getBufferSize(), 0);
409
410 // Override the contents of the "from" file with the contents of the
411 // "to" file. If the caller owns the buffers, then pass a MemoryBufferRef;
412 // otherwise, pass as a std::unique_ptr<MemoryBuffer> to transfer ownership
413 // to the SourceManager.
414 if (InitOpts.RetainRemappedFileBuffers)
415 SourceMgr.overrideFileContents(FromFile, RB.second->getMemBufferRef());
416 else
417 SourceMgr.overrideFileContents(
418 FromFile, std::unique_ptr<llvm::MemoryBuffer>(RB.second));
419 }
420
421 // Remap files in the source manager (with other files).
422 for (const auto &RF : InitOpts.RemappedFiles) {
423 // Find the file that we're mapping to.
424 OptionalFileEntryRef ToFile = FileMgr.getOptionalFileRef(RF.second);
425 if (!ToFile) {
426 Diags.Report(diag::err_fe_remap_missing_to_file) << RF.first << RF.second;
427 continue;
428 }
429
430 // Create the file entry for the file that we're mapping from.
431 FileEntryRef FromFile =
432 FileMgr.getVirtualFileRef(RF.first, ToFile->getSize(), 0);
433
434 // Override the contents of the "from" file with the contents of
435 // the "to" file.
436 SourceMgr.overrideFileContents(FromFile, *ToFile);
437 }
438
439 SourceMgr.setOverridenFilesKeepOriginalName(
441}
442
443// Preprocessor
444
447
448 // The AST reader holds a reference to the old preprocessor (if any).
449 TheASTReader.reset();
450
451 // Create the Preprocessor.
452 HeaderSearch *HeaderInfo =
455 PP = std::make_shared<Preprocessor>(Invocation->getPreprocessorOpts(),
457 getSourceManager(), *HeaderInfo, *this,
458 /*IdentifierInfoLookup=*/nullptr,
459 /*OwnsHeaderSearch=*/true, TUKind);
461 PP->Initialize(getTarget(), getAuxTarget());
462
463 if (PPOpts.DetailedRecord)
464 PP->createPreprocessingRecord();
465
466 // Apply remappings to the source manager.
467 InitializeFileRemapping(PP->getDiagnostics(), PP->getSourceManager(),
468 PP->getFileManager(), PPOpts);
469
470 // Predefine macros and configure the preprocessor.
473
474 // Initialize the header search object. In CUDA compilations, we use the aux
475 // triple (the host triple) to initialize our header search, since we need to
476 // find the host headers in order to compile the CUDA code.
477 const llvm::Triple *HeaderSearchTriple = &PP->getTargetInfo().getTriple();
478 if (PP->getTargetInfo().getTriple().getOS() == llvm::Triple::CUDA &&
479 PP->getAuxTargetInfo())
480 HeaderSearchTriple = &PP->getAuxTargetInfo()->getTriple();
481
482 ApplyHeaderSearchOptions(PP->getHeaderSearchInfo(), getHeaderSearchOpts(),
483 PP->getLangOpts(), *HeaderSearchTriple);
484
485 PP->setPreprocessedOutput(getPreprocessorOutputOpts().ShowCPP);
486
487 if (PP->getLangOpts().Modules && PP->getLangOpts().ImplicitModules) {
488 std::string ModuleHash = getInvocation().getModuleHash();
489 PP->getHeaderSearchInfo().setModuleHash(ModuleHash);
490 PP->getHeaderSearchInfo().setModuleCachePath(
491 getSpecificModuleCachePath(ModuleHash));
492 }
493
494 // Handle generating dependencies, if requested.
496 if (!DepOpts.OutputFile.empty())
497 addDependencyCollector(std::make_shared<DependencyFileGenerator>(DepOpts));
498 if (!DepOpts.DOTOutputFile.empty())
500 getHeaderSearchOpts().Sysroot);
501
502 // If we don't have a collector, but we are collecting module dependencies,
503 // then we're the top level compiler instance and need to create one.
504 if (!ModuleDepCollector && !DepOpts.ModuleDependencyOutputDir.empty()) {
505 ModuleDepCollector = std::make_shared<ModuleDependencyCollector>(
507 }
508
509 // If there is a module dep collector, register with other dep collectors
510 // and also (a) collect header maps and (b) TODO: input vfs overlay files.
511 if (ModuleDepCollector) {
512 addDependencyCollector(ModuleDepCollector);
513 collectHeaderMaps(PP->getHeaderSearchInfo(), ModuleDepCollector);
514 collectIncludePCH(*this, ModuleDepCollector);
515 collectVFSEntries(*this, ModuleDepCollector);
516 }
517
518 // Modules need an output manager.
519 if (!hasOutputManager())
521
522 for (auto &Listener : DependencyCollectors)
523 Listener->attachToPreprocessor(*PP);
524
525 // Handle generating header include information, if requested.
526 if (DepOpts.ShowHeaderIncludes)
527 AttachHeaderIncludeGen(*PP, DepOpts);
528 if (!DepOpts.HeaderIncludeOutputFile.empty()) {
529 StringRef OutputPath = DepOpts.HeaderIncludeOutputFile;
530 if (OutputPath == "-")
531 OutputPath = "";
532 AttachHeaderIncludeGen(*PP, DepOpts,
533 /*ShowAllHeaders=*/true, OutputPath,
534 /*ShowDepth=*/false);
535 }
536
538 AttachHeaderIncludeGen(*PP, DepOpts,
539 /*ShowAllHeaders=*/true, /*OutputPath=*/"",
540 /*ShowDepth=*/true, /*MSStyle=*/true);
541 }
542
543 if (GetDependencyDirectives)
544 PP->setDependencyDirectivesGetter(*GetDependencyDirectives);
545}
546
547std::string CompilerInstance::getSpecificModuleCachePath(StringRef ModuleHash) {
548 assert(FileMgr && "Specific module cache path requires a FileManager");
549
550 if (getHeaderSearchOpts().ModuleCachePath.empty())
551 return "";
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 (!getHeaderSearchOpts().DisableModuleHash)
558 llvm::sys::path::append(SpecificModuleCache, ModuleHash);
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);
889 FileMgr->FixupRelativePath(*AbsPath);
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 auto FinishDiagnosticClient = llvm::make_scope_exit([&]() {
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 " << getTargetOpts().CPU;
1066 }
1067 }
1068 OS << ".\n";
1069 }
1070}
1071
1073 // Load any requested plugins.
1074 for (const std::string &Path : getFrontendOpts().Plugins) {
1075 std::string Error;
1076 if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(Path.c_str(), &Error))
1077 getDiagnostics().Report(diag::err_fe_unable_to_load_plugin)
1078 << Path << Error;
1079 }
1080
1081 // Check if any of the loaded plugins replaces the main AST action
1082 for (const FrontendPluginRegistry::entry &Plugin :
1083 FrontendPluginRegistry::entries()) {
1084 std::unique_ptr<PluginASTAction> P(Plugin.instantiate());
1085 if (P->getActionType() == PluginASTAction::ReplaceAction) {
1087 getFrontendOpts().ActionName = Plugin.getName().str();
1088 break;
1089 }
1090 }
1091}
1092
1093/// Determine the appropriate source input kind based on language
1094/// options.
1096 if (LangOpts.OpenCL)
1097 return Language::OpenCL;
1098 if (LangOpts.CUDA)
1099 return Language::CUDA;
1100 if (LangOpts.ObjC)
1101 return LangOpts.CPlusPlus ? Language::ObjCXX : Language::ObjC;
1102 return LangOpts.CPlusPlus ? Language::CXX : Language::C;
1103}
1104
1105std::unique_ptr<CompilerInstance> CompilerInstance::cloneForModuleCompileImpl(
1106 SourceLocation ImportLoc, StringRef ModuleName, FrontendInputFile Input,
1107 StringRef OriginalModuleMapFile, StringRef ModuleFileName,
1108 std::optional<ThreadSafeCloneConfig> ThreadSafeConfig) {
1109 // Construct a compiler invocation for creating this module.
1110 auto Invocation = std::make_shared<CompilerInvocation>(getInvocation());
1111
1112 PreprocessorOptions &PPOpts = Invocation->getPreprocessorOpts();
1113
1114 // For any options that aren't intended to affect how a module is built,
1115 // reset them to their default values.
1116 Invocation->resetNonModularOptions();
1117
1118 // Remove any macro definitions that are explicitly ignored by the module.
1119 // They aren't supposed to affect how the module is built anyway.
1120 HeaderSearchOptions &HSOpts = Invocation->getHeaderSearchOpts();
1121 llvm::erase_if(PPOpts.Macros,
1122 [&HSOpts](const std::pair<std::string, bool> &def) {
1123 StringRef MacroDef = def.first;
1124 return HSOpts.ModulesIgnoreMacros.contains(
1125 llvm::CachedHashString(MacroDef.split('=').first));
1126 });
1127
1128 // If the original compiler invocation had -fmodule-name, pass it through.
1129 Invocation->getLangOpts().ModuleName =
1131
1132 // Note the name of the module we're building.
1133 Invocation->getLangOpts().CurrentModule = std::string(ModuleName);
1134
1135 // If there is a module map file, build the module using the module map.
1136 // Set up the inputs/outputs so that we build the module from its umbrella
1137 // header.
1138 FrontendOptions &FrontendOpts = Invocation->getFrontendOpts();
1139 FrontendOpts.OutputFile = ModuleFileName.str();
1140 FrontendOpts.DisableFree = false;
1141 FrontendOpts.GenerateGlobalModuleIndex = false;
1142 FrontendOpts.BuildingImplicitModule = true;
1143 FrontendOpts.OriginalModuleMap = std::string(OriginalModuleMapFile);
1144 // Force implicitly-built modules to hash the content of the module file.
1145 HSOpts.ModulesHashContent = true;
1146 FrontendOpts.Inputs = {std::move(Input)};
1147
1148 // Don't free the remapped file buffers; they are owned by our caller.
1149 PPOpts.RetainRemappedFileBuffers = true;
1150
1151 DiagnosticOptions &DiagOpts = Invocation->getDiagnosticOpts();
1152
1153 DiagOpts.VerifyDiagnostics = 0;
1154 assert(getInvocation().getModuleHash() == Invocation->getModuleHash() &&
1155 "Module hash mismatch!");
1156
1157 // Construct a compiler instance that will be used to actually create the
1158 // module. Since we're sharing an in-memory module cache,
1159 // CompilerInstance::CompilerInstance is responsible for finalizing the
1160 // buffers to prevent use-after-frees.
1161 auto InstancePtr = std::make_unique<CompilerInstance>(
1162 std::move(Invocation), getPCHContainerOperations(), &getModuleCache());
1163 auto &Instance = *InstancePtr;
1164
1165 auto &Inv = Instance.getInvocation();
1166
1167 if (ThreadSafeConfig) {
1168 Instance.setVirtualFileSystem(ThreadSafeConfig->getVFS());
1169 Instance.createFileManager();
1170 } else if (FrontendOpts.ModulesShareFileManager) {
1171 Instance.setVirtualFileSystem(getVirtualFileSystemPtr());
1172 Instance.setFileManager(getFileManagerPtr());
1173 } else {
1174 Instance.setVirtualFileSystem(getVirtualFileSystemPtr());
1175 Instance.createFileManager();
1176 }
1177
1178 if (ThreadSafeConfig) {
1179 Instance.createDiagnostics(&ThreadSafeConfig->getDiagConsumer(),
1180 /*ShouldOwnClient=*/false);
1181 } else {
1182 Instance.createDiagnostics(
1183 new ForwardingDiagnosticConsumer(getDiagnosticClient()),
1184 /*ShouldOwnClient=*/true);
1185 }
1186 if (llvm::is_contained(DiagOpts.SystemHeaderWarningsModules, ModuleName))
1187 Instance.getDiagnostics().setSuppressSystemWarnings(false);
1188
1189 Instance.createSourceManager(Instance.getFileManager());
1190 SourceManager &SourceMgr = Instance.getSourceManager();
1191
1192 if (ThreadSafeConfig) {
1193 // Detecting cycles in the module graph is responsibility of the client.
1194 } else {
1195 // Note that this module is part of the module build stack, so that we
1196 // can detect cycles in the module graph.
1197 SourceMgr.setModuleBuildStack(getSourceManager().getModuleBuildStack());
1198 SourceMgr.pushModuleBuildStack(
1199 ModuleName, FullSourceLoc(ImportLoc, getSourceManager()));
1200 }
1201
1202 // Make a copy for the new instance.
1203 Instance.FailedModules = FailedModules;
1204
1205 if (GetDependencyDirectives)
1206 Instance.GetDependencyDirectives =
1207 GetDependencyDirectives->cloneFor(Instance.getFileManager());
1208
1209 if (ThreadSafeConfig) {
1210 Instance.setModuleDepCollector(ThreadSafeConfig->getModuleDepCollector());
1211 } else {
1212 // If we're collecting module dependencies, we need to share a collector
1213 // between all of the module CompilerInstances. Other than that, we don't
1214 // want to produce any dependency output from the module build.
1215 Instance.setModuleDepCollector(getModuleDepCollector());
1216 }
1217 Inv.getDependencyOutputOpts() = DependencyOutputOptions();
1218
1219 return InstancePtr;
1220}
1221
1223 StringRef ModuleName,
1224 StringRef ModuleFileName,
1225 CompilerInstance &Instance) {
1226 llvm::TimeTraceScope TimeScope("Module Compile", ModuleName);
1227
1228 // Never compile a module that's already finalized - this would cause the
1229 // existing module to be freed, causing crashes if it is later referenced
1230 if (getModuleCache().getInMemoryModuleCache().isPCMFinal(ModuleFileName)) {
1231 getDiagnostics().Report(ImportLoc, diag::err_module_rebuild_finalized)
1232 << ModuleName;
1233 return false;
1234 }
1235
1236 getDiagnostics().Report(ImportLoc, diag::remark_module_build)
1237 << ModuleName << ModuleFileName;
1238
1239 // Execute the action to actually build the module in-place. Use a separate
1240 // thread so that we get a stack large enough.
1241 bool Crashed = !llvm::CrashRecoveryContext().RunSafelyOnNewStack(
1242 [&]() {
1244 Instance.ExecuteAction(Action);
1245 },
1247
1248 getDiagnostics().Report(ImportLoc, diag::remark_module_build_done)
1249 << ModuleName;
1250
1251 // Propagate the statistics to the parent FileManager.
1252 if (!getFrontendOpts().ModulesShareFileManager)
1253 getFileManager().AddStats(Instance.getFileManager());
1254
1255 // Propagate the failed modules to the parent instance.
1256 FailedModules = std::move(Instance.FailedModules);
1257
1258 if (Crashed) {
1259 // Clear the ASTConsumer if it hasn't been already, in case it owns streams
1260 // that must be closed before clearing output files.
1261 Instance.setSema(nullptr);
1262 Instance.setASTConsumer(nullptr);
1263
1264 // Delete any remaining temporary files related to Instance.
1265 Instance.clearOutputFiles(/*EraseFiles=*/true);
1266 }
1267
1268 // We've rebuilt a module. If we're allowed to generate or update the global
1269 // module index, record that fact in the importing compiler instance.
1270 if (getFrontendOpts().GenerateGlobalModuleIndex) {
1272 }
1273
1274 // If \p AllowPCMWithCompilerErrors is set return 'success' even if errors
1275 // occurred.
1276 return !Instance.getDiagnostics().hasErrorOccurred() ||
1277 Instance.getFrontendOpts().AllowPCMWithCompilerErrors;
1278}
1279
1282 StringRef Filename = llvm::sys::path::filename(File.getName());
1283 SmallString<128> PublicFilename(File.getDir().getName());
1284 if (Filename == "module_private.map")
1285 llvm::sys::path::append(PublicFilename, "module.map");
1286 else if (Filename == "module.private.modulemap")
1287 llvm::sys::path::append(PublicFilename, "module.modulemap");
1288 else
1289 return std::nullopt;
1290 return FileMgr.getOptionalFileRef(PublicFilename);
1291}
1292
1293std::unique_ptr<CompilerInstance> CompilerInstance::cloneForModuleCompile(
1294 SourceLocation ImportLoc, Module *Module, StringRef ModuleFileName,
1295 std::optional<ThreadSafeCloneConfig> ThreadSafeConfig) {
1296 StringRef ModuleName = Module->getTopLevelModuleName();
1297
1299
1300 // Get or create the module map that we'll use to build this module.
1302 SourceManager &SourceMgr = getSourceManager();
1303
1304 if (FileID ModuleMapFID = ModMap.getContainingModuleMapFileID(Module);
1305 ModuleMapFID.isValid()) {
1306 // We want to use the top-level module map. If we don't, the compiling
1307 // instance may think the containing module map is a top-level one, while
1308 // the importing instance knows it's included from a parent module map via
1309 // the extern directive. This mismatch could bite us later.
1310 SourceLocation Loc = SourceMgr.getIncludeLoc(ModuleMapFID);
1311 while (Loc.isValid() && isModuleMap(SourceMgr.getFileCharacteristic(Loc))) {
1312 ModuleMapFID = SourceMgr.getFileID(Loc);
1313 Loc = SourceMgr.getIncludeLoc(ModuleMapFID);
1314 }
1315
1316 OptionalFileEntryRef ModuleMapFile =
1317 SourceMgr.getFileEntryRefForID(ModuleMapFID);
1318 assert(ModuleMapFile && "Top-level module map with no FileID");
1319
1320 // Canonicalize compilation to start with the public module map. This is
1321 // vital for submodules declarations in the private module maps to be
1322 // correctly parsed when depending on a top level module in the public one.
1323 if (OptionalFileEntryRef PublicMMFile =
1324 getPublicModuleMap(*ModuleMapFile, getFileManager()))
1325 ModuleMapFile = PublicMMFile;
1326
1327 StringRef ModuleMapFilePath = ModuleMapFile->getNameAsRequested();
1328
1329 // Use the systemness of the module map as parsed instead of using the
1330 // IsSystem attribute of the module. If the module has [system] but the
1331 // module map is not in a system path, then this would incorrectly parse
1332 // any other modules in that module map as system too.
1333 const SrcMgr::SLocEntry &SLoc = SourceMgr.getSLocEntry(ModuleMapFID);
1334 bool IsSystem = isSystem(SLoc.getFile().getFileCharacteristic());
1335
1336 // Use the module map where this module resides.
1337 return cloneForModuleCompileImpl(
1338 ImportLoc, ModuleName,
1339 FrontendInputFile(ModuleMapFilePath, IK, IsSystem),
1340 ModMap.getModuleMapFileForUniquing(Module)->getName(), ModuleFileName,
1341 std::move(ThreadSafeConfig));
1342 }
1343
1344 // FIXME: We only need to fake up an input file here as a way of
1345 // transporting the module's directory to the module map parser. We should
1346 // be able to do that more directly, and parse from a memory buffer without
1347 // inventing this file.
1348 SmallString<128> FakeModuleMapFile(Module->Directory->getName());
1349 llvm::sys::path::append(FakeModuleMapFile, "__inferred_module.map");
1350
1351 std::string InferredModuleMapContent;
1352 llvm::raw_string_ostream OS(InferredModuleMapContent);
1353 Module->print(OS);
1354
1355 auto Instance = cloneForModuleCompileImpl(
1356 ImportLoc, ModuleName,
1357 FrontendInputFile(FakeModuleMapFile, IK, +Module->IsSystem),
1358 ModMap.getModuleMapFileForUniquing(Module)->getName(), ModuleFileName,
1359 std::move(ThreadSafeConfig));
1360
1361 std::unique_ptr<llvm::MemoryBuffer> ModuleMapBuffer =
1362 llvm::MemoryBuffer::getMemBufferCopy(InferredModuleMapContent);
1363 FileEntryRef ModuleMapFile = Instance->getFileManager().getVirtualFileRef(
1364 FakeModuleMapFile, InferredModuleMapContent.size(), 0);
1365 Instance->getSourceManager().overrideFileContents(ModuleMapFile,
1366 std::move(ModuleMapBuffer));
1367
1368 return Instance;
1369}
1370
1371/// Read the AST right after compiling the module.
1372static bool readASTAfterCompileModule(CompilerInstance &ImportingInstance,
1373 SourceLocation ImportLoc,
1374 SourceLocation ModuleNameLoc,
1375 Module *Module, StringRef ModuleFileName,
1376 bool *OutOfDate, bool *Missing) {
1377 DiagnosticsEngine &Diags = ImportingInstance.getDiagnostics();
1378
1379 unsigned ModuleLoadCapabilities = ASTReader::ARR_Missing;
1380 if (OutOfDate)
1381 ModuleLoadCapabilities |= ASTReader::ARR_OutOfDate;
1382
1383 // Try to read the module file, now that we've compiled it.
1384 ASTReader::ASTReadResult ReadResult =
1385 ImportingInstance.getASTReader()->ReadAST(
1386 ModuleFileName, serialization::MK_ImplicitModule, ImportLoc,
1387 ModuleLoadCapabilities);
1388 if (ReadResult == ASTReader::Success)
1389 return true;
1390
1391 // The caller wants to handle out-of-date failures.
1392 if (OutOfDate && ReadResult == ASTReader::OutOfDate) {
1393 *OutOfDate = true;
1394 return false;
1395 }
1396
1397 // The caller wants to handle missing module files.
1398 if (Missing && ReadResult == ASTReader::Missing) {
1399 *Missing = true;
1400 return false;
1401 }
1402
1403 // The ASTReader didn't diagnose the error, so conservatively report it.
1404 if (ReadResult == ASTReader::Missing || !Diags.hasErrorOccurred())
1405 Diags.Report(ModuleNameLoc, diag::err_module_not_built)
1406 << Module->Name << SourceRange(ImportLoc, ModuleNameLoc);
1407
1408 return false;
1409}
1410
1411/// Compile a module in a separate compiler instance and read the AST,
1412/// returning true if the module compiles without errors.
1413static bool compileModuleAndReadASTImpl(CompilerInstance &ImportingInstance,
1414 SourceLocation ImportLoc,
1415 SourceLocation ModuleNameLoc,
1416 Module *Module,
1417 StringRef ModuleFileName) {
1418 {
1419 auto Instance = ImportingInstance.cloneForModuleCompile(
1420 ModuleNameLoc, Module, ModuleFileName);
1421
1422 if (!ImportingInstance.compileModule(ModuleNameLoc,
1424 ModuleFileName, *Instance)) {
1425 ImportingInstance.getDiagnostics().Report(ModuleNameLoc,
1426 diag::err_module_not_built)
1427 << Module->Name << SourceRange(ImportLoc, ModuleNameLoc);
1428 return false;
1429 }
1430 }
1431
1432 // The module is built successfully, we can update its timestamp now.
1433 if (ImportingInstance.getPreprocessor()
1437 ImportingInstance.getModuleCache().updateModuleTimestamp(ModuleFileName);
1438 }
1439
1440 return readASTAfterCompileModule(ImportingInstance, ImportLoc, ModuleNameLoc,
1441 Module, ModuleFileName,
1442 /*OutOfDate=*/nullptr, /*Missing=*/nullptr);
1443}
1444
1445/// Compile a module in a separate compiler instance and read the AST,
1446/// returning true if the module compiles without errors, using a lock manager
1447/// to avoid building the same module in multiple compiler instances.
1448///
1449/// Uses a lock file manager and exponential backoff to reduce the chances that
1450/// multiple instances will compete to create the same module. On timeout,
1451/// deletes the lock file in order to avoid deadlock from crashing processes or
1452/// bugs in the lock file manager.
1454 CompilerInstance &ImportingInstance, SourceLocation ImportLoc,
1455 SourceLocation ModuleNameLoc, Module *Module, StringRef ModuleFileName) {
1456 DiagnosticsEngine &Diags = ImportingInstance.getDiagnostics();
1457
1458 Diags.Report(ModuleNameLoc, diag::remark_module_lock)
1459 << ModuleFileName << Module->Name;
1460
1461 auto &ModuleCache = ImportingInstance.getModuleCache();
1462 ModuleCache.prepareForGetLock(ModuleFileName);
1463
1464 while (true) {
1465 auto Lock = ModuleCache.getLock(ModuleFileName);
1466 bool Owned;
1467 if (llvm::Error Err = Lock->tryLock().moveInto(Owned)) {
1468 // ModuleCache takes care of correctness and locks are only necessary for
1469 // performance. Fallback to building the module in case of any lock
1470 // related errors.
1471 Diags.Report(ModuleNameLoc, diag::remark_module_lock_failure)
1472 << Module->Name << toString(std::move(Err));
1473 return compileModuleAndReadASTImpl(ImportingInstance, ImportLoc,
1474 ModuleNameLoc, Module, ModuleFileName);
1475 }
1476 if (Owned) {
1477 // We're responsible for building the module ourselves.
1478 return compileModuleAndReadASTImpl(ImportingInstance, ImportLoc,
1479 ModuleNameLoc, Module, ModuleFileName);
1480 }
1481
1482 // Someone else is responsible for building the module. Wait for them to
1483 // finish.
1484 switch (Lock->waitForUnlockFor(std::chrono::seconds(90))) {
1485 case llvm::WaitForUnlockResult::Success:
1486 break; // The interesting case.
1487 case llvm::WaitForUnlockResult::OwnerDied:
1488 continue; // try again to get the lock.
1489 case llvm::WaitForUnlockResult::Timeout:
1490 // Since the InMemoryModuleCache takes care of correctness, we try waiting
1491 // for someone else to complete the build so that it does not happen
1492 // twice. In case of timeout, build it ourselves.
1493 Diags.Report(ModuleNameLoc, diag::remark_module_lock_timeout)
1494 << Module->Name;
1495 // Clear the lock file so that future invocations can make progress.
1496 Lock->unsafeMaybeUnlock();
1497 continue;
1498 }
1499
1500 // Read the module that was just written by someone else.
1501 bool OutOfDate = false;
1502 bool Missing = false;
1503 if (readASTAfterCompileModule(ImportingInstance, ImportLoc, ModuleNameLoc,
1504 Module, ModuleFileName, &OutOfDate, &Missing))
1505 return true;
1506 if (!OutOfDate && !Missing)
1507 return false;
1508
1509 // The module may be missing or out of date in the presence of file system
1510 // races. It may also be out of date if one of its imports depends on header
1511 // search paths that are not consistent with this ImportingInstance.
1512 // Try again...
1513 }
1514}
1515
1516/// Compile a module in a separate compiler instance and read the AST,
1517/// returning true if the module compiles without errors, potentially using a
1518/// lock manager to avoid building the same module in multiple compiler
1519/// instances.
1520static bool compileModuleAndReadAST(CompilerInstance &ImportingInstance,
1521 SourceLocation ImportLoc,
1522 SourceLocation ModuleNameLoc,
1523 Module *Module, StringRef ModuleFileName) {
1524 return ImportingInstance.getInvocation()
1527 ? compileModuleAndReadASTBehindLock(ImportingInstance, ImportLoc,
1528 ModuleNameLoc, Module,
1529 ModuleFileName)
1530 : compileModuleAndReadASTImpl(ImportingInstance, ImportLoc,
1531 ModuleNameLoc, Module,
1532 ModuleFileName);
1533}
1534
1535/// Diagnose differences between the current definition of the given
1536/// configuration macro and the definition provided on the command line.
1537static void checkConfigMacro(Preprocessor &PP, StringRef ConfigMacro,
1538 Module *Mod, SourceLocation ImportLoc) {
1539 IdentifierInfo *Id = PP.getIdentifierInfo(ConfigMacro);
1540 SourceManager &SourceMgr = PP.getSourceManager();
1541
1542 // If this identifier has never had a macro definition, then it could
1543 // not have changed.
1544 if (!Id->hadMacroDefinition())
1545 return;
1546 auto *LatestLocalMD = PP.getLocalMacroDirectiveHistory(Id);
1547
1548 // Find the macro definition from the command line.
1549 MacroInfo *CmdLineDefinition = nullptr;
1550 for (auto *MD = LatestLocalMD; MD; MD = MD->getPrevious()) {
1551 // We only care about the predefines buffer.
1552 FileID FID = SourceMgr.getFileID(MD->getLocation());
1553 if (FID.isInvalid() || FID != PP.getPredefinesFileID())
1554 continue;
1555 if (auto *DMD = dyn_cast<DefMacroDirective>(MD))
1556 CmdLineDefinition = DMD->getMacroInfo();
1557 break;
1558 }
1559
1560 auto *CurrentDefinition = PP.getMacroInfo(Id);
1561 if (CurrentDefinition == CmdLineDefinition) {
1562 // Macro matches. Nothing to do.
1563 } else if (!CurrentDefinition) {
1564 // This macro was defined on the command line, then #undef'd later.
1565 // Complain.
1566 PP.Diag(ImportLoc, diag::warn_module_config_macro_undef)
1567 << true << ConfigMacro << Mod->getFullModuleName();
1568 auto LatestDef = LatestLocalMD->getDefinition();
1569 assert(LatestDef.isUndefined() &&
1570 "predefined macro went away with no #undef?");
1571 PP.Diag(LatestDef.getUndefLocation(), diag::note_module_def_undef_here)
1572 << true;
1573 return;
1574 } else if (!CmdLineDefinition) {
1575 // There was no definition for this macro in the predefines buffer,
1576 // but there was a local definition. Complain.
1577 PP.Diag(ImportLoc, diag::warn_module_config_macro_undef)
1578 << false << ConfigMacro << Mod->getFullModuleName();
1579 PP.Diag(CurrentDefinition->getDefinitionLoc(),
1580 diag::note_module_def_undef_here)
1581 << false;
1582 } else if (!CurrentDefinition->isIdenticalTo(*CmdLineDefinition, PP,
1583 /*Syntactically=*/true)) {
1584 // The macro definitions differ.
1585 PP.Diag(ImportLoc, diag::warn_module_config_macro_undef)
1586 << false << ConfigMacro << Mod->getFullModuleName();
1587 PP.Diag(CurrentDefinition->getDefinitionLoc(),
1588 diag::note_module_def_undef_here)
1589 << false;
1590 }
1591}
1592
1594 SourceLocation ImportLoc) {
1595 clang::Module *TopModule = M->getTopLevelModule();
1596 for (const StringRef ConMacro : TopModule->ConfigMacros) {
1597 checkConfigMacro(PP, ConMacro, M, ImportLoc);
1598 }
1599}
1600
1601/// Write a new timestamp file with the given path.
1602static void writeTimestampFile(StringRef TimestampFile) {
1603 std::error_code EC;
1604 llvm::raw_fd_ostream Out(TimestampFile.str(), EC, llvm::sys::fs::OF_None);
1605}
1606
1607/// Prune the module cache of modules that haven't been accessed in
1608/// a long time.
1609static void pruneModuleCache(const HeaderSearchOptions &HSOpts) {
1610 llvm::sys::fs::file_status StatBuf;
1611 llvm::SmallString<128> TimestampFile;
1612 TimestampFile = HSOpts.ModuleCachePath;
1613 assert(!TimestampFile.empty());
1614 llvm::sys::path::append(TimestampFile, "modules.timestamp");
1615
1616 // Try to stat() the timestamp file.
1617 if (std::error_code EC = llvm::sys::fs::status(TimestampFile, StatBuf)) {
1618 // If the timestamp file wasn't there, create one now.
1619 if (EC == std::errc::no_such_file_or_directory) {
1620 writeTimestampFile(TimestampFile);
1621 }
1622 return;
1623 }
1624
1625 // Check whether the time stamp is older than our pruning interval.
1626 // If not, do nothing.
1627 time_t TimeStampModTime =
1628 llvm::sys::toTimeT(StatBuf.getLastModificationTime());
1629 time_t CurrentTime = time(nullptr);
1630 if (CurrentTime - TimeStampModTime <= time_t(HSOpts.ModuleCachePruneInterval))
1631 return;
1632
1633 // Write a new timestamp file so that nobody else attempts to prune.
1634 // There is a benign race condition here, if two Clang instances happen to
1635 // notice at the same time that the timestamp is out-of-date.
1636 writeTimestampFile(TimestampFile);
1637
1638 // Walk the entire module cache, looking for unused module files and module
1639 // indices.
1640 std::error_code EC;
1641 for (llvm::sys::fs::directory_iterator Dir(HSOpts.ModuleCachePath, EC),
1642 DirEnd;
1643 Dir != DirEnd && !EC; Dir.increment(EC)) {
1644 // If we don't have a directory, there's nothing to look into.
1645 if (!llvm::sys::fs::is_directory(Dir->path()))
1646 continue;
1647
1648 // Walk all of the files within this directory.
1649 for (llvm::sys::fs::directory_iterator File(Dir->path(), EC), FileEnd;
1650 File != FileEnd && !EC; File.increment(EC)) {
1651 // We only care about module and global module index files.
1652 StringRef Extension = llvm::sys::path::extension(File->path());
1653 if (Extension != ".pcm" && Extension != ".timestamp" &&
1654 llvm::sys::path::filename(File->path()) != "modules.idx")
1655 continue;
1656
1657 // Look at this file. If we can't stat it, there's nothing interesting
1658 // there.
1659 if (llvm::sys::fs::status(File->path(), StatBuf))
1660 continue;
1661
1662 // If the file has been used recently enough, leave it there.
1663 time_t FileAccessTime = llvm::sys::toTimeT(StatBuf.getLastAccessedTime());
1664 if (CurrentTime - FileAccessTime <=
1665 time_t(HSOpts.ModuleCachePruneAfter)) {
1666 continue;
1667 }
1668
1669 // Remove the file.
1670 llvm::sys::fs::remove(File->path());
1671
1672 // Remove the timestamp file.
1673 std::string TimpestampFilename = File->path() + ".timestamp";
1674 llvm::sys::fs::remove(TimpestampFilename);
1675 }
1676
1677 // If we removed all of the files in the directory, remove the directory
1678 // itself.
1679 if (llvm::sys::fs::directory_iterator(Dir->path(), EC) ==
1680 llvm::sys::fs::directory_iterator() && !EC)
1681 llvm::sys::fs::remove(Dir->path());
1682 }
1683}
1684
1686 if (TheASTReader)
1687 return;
1688
1689 if (!hasASTContext())
1691
1692 // If we're implicitly building modules but not currently recursively
1693 // building a module, check whether we need to prune the module cache.
1694 if (getSourceManager().getModuleBuildStack().empty() &&
1695 !getPreprocessor().getHeaderSearchInfo().getModuleCachePath().empty() &&
1696 getHeaderSearchOpts().ModuleCachePruneInterval > 0 &&
1697 getHeaderSearchOpts().ModuleCachePruneAfter > 0) {
1699 }
1700
1702 std::string Sysroot = HSOpts.Sysroot;
1703 const PreprocessorOptions &PPOpts = getPreprocessorOpts();
1704 const FrontendOptions &FEOpts = getFrontendOpts();
1705 std::unique_ptr<llvm::Timer> ReadTimer;
1706
1707 if (timerGroup)
1708 ReadTimer = std::make_unique<llvm::Timer>("reading_modules",
1709 "Reading modules", *timerGroup);
1710 TheASTReader = llvm::makeIntrusiveRefCnt<ASTReader>(
1713 getFrontendOpts().ModuleFileExtensions,
1714 Sysroot.empty() ? "" : Sysroot.c_str(),
1716 /*AllowASTWithCompilerErrors=*/FEOpts.AllowPCMWithCompilerErrors,
1717 /*AllowConfigurationMismatch=*/false,
1721 +getFrontendOpts().UseGlobalModuleIndex, std::move(ReadTimer));
1722 if (hasASTConsumer()) {
1723 TheASTReader->setDeserializationListener(
1724 getASTConsumer().GetASTDeserializationListener());
1726 getASTConsumer().GetASTMutationListener());
1727 }
1728 getASTContext().setExternalSource(TheASTReader);
1729 if (hasSema())
1730 TheASTReader->InitializeSema(getSema());
1731 if (hasASTConsumer())
1732 TheASTReader->StartTranslationUnit(&getASTConsumer());
1733
1734 for (auto &Listener : DependencyCollectors)
1735 Listener->attachToASTReader(*TheASTReader);
1736}
1737
1739 StringRef FileName, serialization::ModuleFile *&LoadedModuleFile) {
1740 llvm::Timer Timer;
1741 if (timerGroup)
1742 Timer.init("preloading." + FileName.str(), "Preloading " + FileName.str(),
1743 *timerGroup);
1744 llvm::TimeRegion TimeLoading(timerGroup ? &Timer : nullptr);
1745
1746 // If we don't already have an ASTReader, create one now.
1747 if (!TheASTReader)
1749
1750 // If -Wmodule-file-config-mismatch is mapped as an error or worse, allow the
1751 // ASTReader to diagnose it, since it can produce better errors that we can.
1752 bool ConfigMismatchIsRecoverable =
1753 getDiagnostics().getDiagnosticLevel(diag::warn_module_config_mismatch,
1756
1757 auto Listener = std::make_unique<ReadModuleNames>(*PP);
1758 auto &ListenerRef = *Listener;
1759 ASTReader::ListenerScope ReadModuleNamesListener(*TheASTReader,
1760 std::move(Listener));
1761
1762 // Try to load the module file.
1763 switch (TheASTReader->ReadAST(
1765 ConfigMismatchIsRecoverable ? ASTReader::ARR_ConfigurationMismatch : 0,
1766 &LoadedModuleFile)) {
1767 case ASTReader::Success:
1768 // We successfully loaded the module file; remember the set of provided
1769 // modules so that we don't try to load implicit modules for them.
1770 ListenerRef.registerAll();
1771 return true;
1772
1774 // Ignore unusable module files.
1775 getDiagnostics().Report(SourceLocation(), diag::warn_module_config_mismatch)
1776 << FileName;
1777 // All modules provided by any files we tried and failed to load are now
1778 // unavailable; includes of those modules should now be handled textually.
1779 ListenerRef.markAllUnavailable();
1780 return true;
1781
1782 default:
1783 return false;
1784 }
1785}
1786
1787namespace {
1788enum ModuleSource {
1789 MS_ModuleNotFound,
1790 MS_ModuleCache,
1791 MS_PrebuiltModulePath,
1792 MS_ModuleBuildPragma
1793};
1794} // end namespace
1795
1796/// Select a source for loading the named module and compute the filename to
1797/// load it from.
1798static ModuleSource selectModuleSource(
1799 Module *M, StringRef ModuleName, std::string &ModuleFilename,
1800 const std::map<std::string, std::string, std::less<>> &BuiltModules,
1801 HeaderSearch &HS) {
1802 assert(ModuleFilename.empty() && "Already has a module source?");
1803
1804 // Check to see if the module has been built as part of this compilation
1805 // via a module build pragma.
1806 auto BuiltModuleIt = BuiltModules.find(ModuleName);
1807 if (BuiltModuleIt != BuiltModules.end()) {
1808 ModuleFilename = BuiltModuleIt->second;
1809 return MS_ModuleBuildPragma;
1810 }
1811
1812 // Try to load the module from the prebuilt module path.
1813 const HeaderSearchOptions &HSOpts = HS.getHeaderSearchOpts();
1814 if (!HSOpts.PrebuiltModuleFiles.empty() ||
1815 !HSOpts.PrebuiltModulePaths.empty()) {
1816 ModuleFilename = HS.getPrebuiltModuleFileName(ModuleName);
1817 if (HSOpts.EnablePrebuiltImplicitModules && ModuleFilename.empty())
1818 ModuleFilename = HS.getPrebuiltImplicitModuleFileName(M);
1819 if (!ModuleFilename.empty())
1820 return MS_PrebuiltModulePath;
1821 }
1822
1823 // Try to load the module from the module cache.
1824 if (M) {
1825 ModuleFilename = HS.getCachedModuleFileName(M);
1826 return MS_ModuleCache;
1827 }
1828
1829 return MS_ModuleNotFound;
1830}
1831
1832ModuleLoadResult CompilerInstance::findOrCompileModuleAndReadAST(
1833 StringRef ModuleName, SourceLocation ImportLoc,
1834 SourceLocation ModuleNameLoc, bool IsInclusionDirective) {
1835 // Search for a module with the given name.
1836 HeaderSearch &HS = PP->getHeaderSearchInfo();
1837 Module *M =
1838 HS.lookupModule(ModuleName, ImportLoc, true, !IsInclusionDirective);
1839
1840 // Check for any configuration macros that have changed. This is done
1841 // immediately before potentially building a module in case this module
1842 // depends on having one of its configuration macros defined to successfully
1843 // build. If this is not done the user will never see the warning.
1844 if (M)
1845 checkConfigMacros(getPreprocessor(), M, ImportLoc);
1846
1847 // Select the source and filename for loading the named module.
1848 std::string ModuleFilename;
1849 ModuleSource Source =
1850 selectModuleSource(M, ModuleName, ModuleFilename, BuiltModules, HS);
1851 if (Source == MS_ModuleNotFound) {
1852 // We can't find a module, error out here.
1853 getDiagnostics().Report(ModuleNameLoc, diag::err_module_not_found)
1854 << ModuleName << SourceRange(ImportLoc, ModuleNameLoc);
1855 return nullptr;
1856 }
1857 if (ModuleFilename.empty()) {
1858 if (M && M->HasIncompatibleModuleFile) {
1859 // We tried and failed to load a module file for this module. Fall
1860 // back to textual inclusion for its headers.
1862 }
1863
1864 getDiagnostics().Report(ModuleNameLoc, diag::err_module_build_disabled)
1865 << ModuleName;
1866 return nullptr;
1867 }
1868
1869 // Create an ASTReader on demand.
1870 if (!getASTReader())
1872
1873 // Time how long it takes to load the module.
1874 llvm::Timer Timer;
1875 if (timerGroup)
1876 Timer.init("loading." + ModuleFilename, "Loading " + ModuleFilename,
1877 *timerGroup);
1878 llvm::TimeRegion TimeLoading(timerGroup ? &Timer : nullptr);
1879 llvm::TimeTraceScope TimeScope("Module Load", ModuleName);
1880
1881 // Try to load the module file. If we are not trying to load from the
1882 // module cache, we don't know how to rebuild modules.
1883 unsigned ARRFlags = Source == MS_ModuleCache
1886 : Source == MS_PrebuiltModulePath
1887 ? 0
1889 switch (getASTReader()->ReadAST(ModuleFilename,
1890 Source == MS_PrebuiltModulePath
1892 : Source == MS_ModuleBuildPragma
1895 ImportLoc, ARRFlags)) {
1896 case ASTReader::Success: {
1897 if (M)
1898 return M;
1899 assert(Source != MS_ModuleCache &&
1900 "missing module, but file loaded from cache");
1901
1902 // A prebuilt module is indexed as a ModuleFile; the Module does not exist
1903 // until the first call to ReadAST. Look it up now.
1904 M = HS.lookupModule(ModuleName, ImportLoc, true, !IsInclusionDirective);
1905
1906 // Check whether M refers to the file in the prebuilt module path.
1907 if (M && M->getASTFile())
1908 if (auto ModuleFile = FileMgr->getOptionalFileRef(ModuleFilename))
1909 if (*ModuleFile == M->getASTFile())
1910 return M;
1911
1912 getDiagnostics().Report(ModuleNameLoc, diag::err_module_prebuilt)
1913 << ModuleName;
1914 return ModuleLoadResult();
1915 }
1916
1918 case ASTReader::Missing:
1919 // The most interesting case.
1920 break;
1921
1923 if (Source == MS_PrebuiltModulePath)
1924 // FIXME: We shouldn't be setting HadFatalFailure below if we only
1925 // produce a warning here!
1926 getDiagnostics().Report(SourceLocation(),
1927 diag::warn_module_config_mismatch)
1928 << ModuleFilename;
1929 // Fall through to error out.
1930 [[fallthrough]];
1934 // FIXME: The ASTReader will already have complained, but can we shoehorn
1935 // that diagnostic information into a more useful form?
1936 return ModuleLoadResult();
1937
1938 case ASTReader::Failure:
1940 return ModuleLoadResult();
1941 }
1942
1943 // ReadAST returned Missing or OutOfDate.
1944 if (Source != MS_ModuleCache) {
1945 // We don't know the desired configuration for this module and don't
1946 // necessarily even have a module map. Since ReadAST already produces
1947 // diagnostics for these two cases, we simply error out here.
1948 return ModuleLoadResult();
1949 }
1950
1951 // The module file is missing or out-of-date. Build it.
1952 assert(M && "missing module, but trying to compile for cache");
1953
1954 // Check whether there is a cycle in the module graph.
1956 ModuleBuildStack::iterator Pos = ModPath.begin(), PosEnd = ModPath.end();
1957 for (; Pos != PosEnd; ++Pos) {
1958 if (Pos->first == ModuleName)
1959 break;
1960 }
1961
1962 if (Pos != PosEnd) {
1963 SmallString<256> CyclePath;
1964 for (; Pos != PosEnd; ++Pos) {
1965 CyclePath += Pos->first;
1966 CyclePath += " -> ";
1967 }
1968 CyclePath += ModuleName;
1969
1970 getDiagnostics().Report(ModuleNameLoc, diag::err_module_cycle)
1971 << ModuleName << CyclePath;
1972 return nullptr;
1973 }
1974
1975 // Check whether we have already attempted to build this module (but failed).
1976 if (FailedModules.contains(ModuleName)) {
1977 getDiagnostics().Report(ModuleNameLoc, diag::err_module_not_built)
1978 << ModuleName << SourceRange(ImportLoc, ModuleNameLoc);
1979 return nullptr;
1980 }
1981
1982 // Try to compile and then read the AST.
1983 if (!compileModuleAndReadAST(*this, ImportLoc, ModuleNameLoc, M,
1984 ModuleFilename)) {
1985 assert(getDiagnostics().hasErrorOccurred() &&
1986 "undiagnosed error in compileModuleAndReadAST");
1987 FailedModules.insert(ModuleName);
1988 return nullptr;
1989 }
1990
1991 // Okay, we've rebuilt and now loaded the module.
1992 return M;
1993}
1994
1997 ModuleIdPath Path,
1999 bool IsInclusionDirective) {
2000 // Determine what file we're searching from.
2001 StringRef ModuleName = Path[0].getIdentifierInfo()->getName();
2002 SourceLocation ModuleNameLoc = Path[0].getLoc();
2003
2004 // If we've already handled this import, just return the cached result.
2005 // This one-element cache is important to eliminate redundant diagnostics
2006 // when both the preprocessor and parser see the same import declaration.
2007 if (ImportLoc.isValid() && LastModuleImportLoc == ImportLoc) {
2008 // Make the named module visible.
2009 if (LastModuleImportResult && ModuleName != getLangOpts().CurrentModule)
2010 TheASTReader->makeModuleVisible(LastModuleImportResult, Visibility,
2011 ImportLoc);
2012 return LastModuleImportResult;
2013 }
2014
2015 // If we don't already have information on this module, load the module now.
2016 Module *Module = nullptr;
2018 if (auto MaybeModule = MM.getCachedModuleLoad(*Path[0].getIdentifierInfo())) {
2019 // Use the cached result, which may be nullptr.
2020 Module = *MaybeModule;
2021 // Config macros are already checked before building a module, but they need
2022 // to be checked at each import location in case any of the config macros
2023 // have a new value at the current `ImportLoc`.
2024 if (Module)
2026 } else if (ModuleName == getLangOpts().CurrentModule) {
2027 // This is the module we're building.
2028 Module = PP->getHeaderSearchInfo().lookupModule(
2029 ModuleName, ImportLoc, /*AllowSearch*/ true,
2030 /*AllowExtraModuleMapSearch*/ !IsInclusionDirective);
2031
2032 // Config macros do not need to be checked here for two reasons.
2033 // * This will always be textual inclusion, and thus the config macros
2034 // actually do impact the content of the header.
2035 // * `Preprocessor::HandleHeaderIncludeOrImport` will never call this
2036 // function as the `#include` or `#import` is textual.
2037
2038 MM.cacheModuleLoad(*Path[0].getIdentifierInfo(), Module);
2039 } else {
2040 ModuleLoadResult Result = findOrCompileModuleAndReadAST(
2041 ModuleName, ImportLoc, ModuleNameLoc, IsInclusionDirective);
2042 if (!Result.isNormal())
2043 return Result;
2044 if (!Result)
2045 DisableGeneratingGlobalModuleIndex = true;
2046 Module = Result;
2047 MM.cacheModuleLoad(*Path[0].getIdentifierInfo(), Module);
2048 }
2049
2050 // If we never found the module, fail. Otherwise, verify the module and link
2051 // it up.
2052 if (!Module)
2053 return ModuleLoadResult();
2054
2055 // Verify that the rest of the module path actually corresponds to
2056 // a submodule.
2057 bool MapPrivateSubModToTopLevel = false;
2058 for (unsigned I = 1, N = Path.size(); I != N; ++I) {
2059 StringRef Name = Path[I].getIdentifierInfo()->getName();
2060 clang::Module *Sub = Module->findSubmodule(Name);
2061
2062 // If the user is requesting Foo.Private and it doesn't exist, try to
2063 // match Foo_Private and emit a warning asking for the user to write
2064 // @import Foo_Private instead. FIXME: remove this when existing clients
2065 // migrate off of Foo.Private syntax.
2066 if (!Sub && Name == "Private" && Module == Module->getTopLevelModule()) {
2067 SmallString<128> PrivateModule(Module->Name);
2068 PrivateModule.append("_Private");
2069
2071 auto &II = PP->getIdentifierTable().get(
2072 PrivateModule, PP->getIdentifierInfo(Module->Name)->getTokenID());
2073 PrivPath.emplace_back(Path[0].getLoc(), &II);
2074
2075 std::string FileName;
2076 // If there is a modulemap module or prebuilt module, load it.
2077 if (PP->getHeaderSearchInfo().lookupModule(PrivateModule, ImportLoc, true,
2078 !IsInclusionDirective) ||
2079 selectModuleSource(nullptr, PrivateModule, FileName, BuiltModules,
2080 PP->getHeaderSearchInfo()) != MS_ModuleNotFound)
2081 Sub = loadModule(ImportLoc, PrivPath, Visibility, IsInclusionDirective);
2082 if (Sub) {
2083 MapPrivateSubModToTopLevel = true;
2084 PP->markClangModuleAsAffecting(Module);
2085 if (!getDiagnostics().isIgnored(
2086 diag::warn_no_priv_submodule_use_toplevel, ImportLoc)) {
2087 getDiagnostics().Report(Path[I].getLoc(),
2088 diag::warn_no_priv_submodule_use_toplevel)
2089 << Path[I].getIdentifierInfo() << Module->getFullModuleName()
2090 << PrivateModule
2091 << SourceRange(Path[0].getLoc(), Path[I].getLoc())
2092 << FixItHint::CreateReplacement(SourceRange(Path[0].getLoc()),
2093 PrivateModule);
2094 getDiagnostics().Report(Sub->DefinitionLoc,
2095 diag::note_private_top_level_defined);
2096 }
2097 }
2098 }
2099
2100 if (!Sub) {
2101 // Attempt to perform typo correction to find a module name that works.
2103 unsigned BestEditDistance = (std::numeric_limits<unsigned>::max)();
2104
2105 for (class Module *SubModule : Module->submodules()) {
2106 unsigned ED =
2107 Name.edit_distance(SubModule->Name,
2108 /*AllowReplacements=*/true, BestEditDistance);
2109 if (ED <= BestEditDistance) {
2110 if (ED < BestEditDistance) {
2111 Best.clear();
2112 BestEditDistance = ED;
2113 }
2114
2115 Best.push_back(SubModule->Name);
2116 }
2117 }
2118
2119 // If there was a clear winner, user it.
2120 if (Best.size() == 1) {
2121 getDiagnostics().Report(Path[I].getLoc(),
2122 diag::err_no_submodule_suggest)
2123 << Path[I].getIdentifierInfo() << Module->getFullModuleName()
2124 << Best[0] << SourceRange(Path[0].getLoc(), Path[I - 1].getLoc())
2125 << FixItHint::CreateReplacement(SourceRange(Path[I].getLoc()),
2126 Best[0]);
2127
2128 Sub = Module->findSubmodule(Best[0]);
2129 }
2130 }
2131
2132 if (!Sub) {
2133 // No submodule by this name. Complain, and don't look for further
2134 // submodules.
2135 getDiagnostics().Report(Path[I].getLoc(), diag::err_no_submodule)
2136 << Path[I].getIdentifierInfo() << Module->getFullModuleName()
2137 << SourceRange(Path[0].getLoc(), Path[I - 1].getLoc());
2138 break;
2139 }
2140
2141 Module = Sub;
2142 }
2143
2144 // Make the named module visible, if it's not already part of the module
2145 // we are parsing.
2146 if (ModuleName != getLangOpts().CurrentModule) {
2147 if (!Module->IsFromModuleFile && !MapPrivateSubModToTopLevel) {
2148 // We have an umbrella header or directory that doesn't actually include
2149 // all of the headers within the directory it covers. Complain about
2150 // this missing submodule and recover by forgetting that we ever saw
2151 // this submodule.
2152 // FIXME: Should we detect this at module load time? It seems fairly
2153 // expensive (and rare).
2154 getDiagnostics().Report(ImportLoc, diag::warn_missing_submodule)
2156 << SourceRange(Path.front().getLoc(), Path.back().getLoc());
2157
2159 }
2160
2161 // Check whether this module is available.
2163 *Module, getDiagnostics())) {
2164 getDiagnostics().Report(ImportLoc, diag::note_module_import_here)
2165 << SourceRange(Path.front().getLoc(), Path.back().getLoc());
2166 LastModuleImportLoc = ImportLoc;
2167 LastModuleImportResult = ModuleLoadResult();
2168 return ModuleLoadResult();
2169 }
2170
2171 TheASTReader->makeModuleVisible(Module, Visibility, ImportLoc);
2172 }
2173
2174 // Resolve any remaining module using export_as for this one.
2177 .getModuleMap()
2179
2180 LastModuleImportLoc = ImportLoc;
2181 LastModuleImportResult = ModuleLoadResult(Module);
2182 return LastModuleImportResult;
2183}
2184
2186 StringRef ModuleName,
2187 StringRef Source) {
2188 // Avoid creating filenames with special characters.
2189 SmallString<128> CleanModuleName(ModuleName);
2190 for (auto &C : CleanModuleName)
2191 if (!isAlphanumeric(C))
2192 C = '_';
2193
2194 // FIXME: Using a randomized filename here means that our intermediate .pcm
2195 // output is nondeterministic (as .pcm files refer to each other by name).
2196 // Can this affect the output in any way?
2197 SmallString<128> ModuleFileName;
2198 if (std::error_code EC = llvm::sys::fs::createTemporaryFile(
2199 CleanModuleName, "pcm", ModuleFileName)) {
2200 getDiagnostics().Report(ImportLoc, diag::err_fe_unable_to_open_output)
2201 << ModuleFileName << EC.message();
2202 return;
2203 }
2204 std::string ModuleMapFileName = (CleanModuleName + ".map").str();
2205
2206 FrontendInputFile Input(
2207 ModuleMapFileName,
2208 InputKind(getLanguageFromOptions(Invocation->getLangOpts()),
2209 InputKind::ModuleMap, /*Preprocessed*/true));
2210
2211 std::string NullTerminatedSource(Source.str());
2212
2213 auto Other = cloneForModuleCompileImpl(ImportLoc, ModuleName, Input,
2214 StringRef(), ModuleFileName);
2215
2216 // Create a virtual file containing our desired source.
2217 // FIXME: We shouldn't need to do this.
2218 FileEntryRef ModuleMapFile = Other->getFileManager().getVirtualFileRef(
2219 ModuleMapFileName, NullTerminatedSource.size(), 0);
2220 Other->getSourceManager().overrideFileContents(
2221 ModuleMapFile, llvm::MemoryBuffer::getMemBuffer(NullTerminatedSource));
2222
2223 Other->BuiltModules = std::move(BuiltModules);
2224 Other->DeleteBuiltModules = false;
2225
2226 // Build the module, inheriting any modules that we've built locally.
2227 bool Success = compileModule(ImportLoc, ModuleName, ModuleFileName, *Other);
2228
2229 BuiltModules = std::move(Other->BuiltModules);
2230
2231 if (Success) {
2232 BuiltModules[std::string(ModuleName)] = std::string(ModuleFileName);
2233 llvm::sys::RemoveFileOnSignal(ModuleFileName);
2234 }
2235}
2236
2239 SourceLocation ImportLoc) {
2240 if (!TheASTReader)
2242 if (!TheASTReader)
2243 return;
2244
2245 TheASTReader->makeModuleVisible(Mod, Visibility, ImportLoc);
2246}
2247
2249 SourceLocation TriggerLoc) {
2250 if (getPreprocessor().getHeaderSearchInfo().getModuleCachePath().empty())
2251 return nullptr;
2252 if (!TheASTReader)
2254 // Can't do anything if we don't have the module manager.
2255 if (!TheASTReader)
2256 return nullptr;
2257 // Get an existing global index. This loads it if not already
2258 // loaded.
2259 TheASTReader->loadGlobalIndex();
2260 GlobalModuleIndex *GlobalIndex = TheASTReader->getGlobalIndex();
2261 // If the global index doesn't exist, create it.
2262 if (!GlobalIndex && shouldBuildGlobalModuleIndex() && hasFileManager() &&
2263 hasPreprocessor()) {
2264 llvm::sys::fs::create_directories(
2265 getPreprocessor().getHeaderSearchInfo().getModuleCachePath());
2266 if (llvm::Error Err = GlobalModuleIndex::writeIndex(
2268 getPreprocessor().getHeaderSearchInfo().getModuleCachePath())) {
2269 // FIXME this drops the error on the floor. This code is only used for
2270 // typo correction and drops more than just this one source of errors
2271 // (such as the directory creation failure above). It should handle the
2272 // error.
2273 consumeError(std::move(Err));
2274 return nullptr;
2275 }
2276 TheASTReader->resetForReload();
2277 TheASTReader->loadGlobalIndex();
2278 GlobalIndex = TheASTReader->getGlobalIndex();
2279 }
2280 // For finding modules needing to be imported for fixit messages,
2281 // we need to make the global index cover all modules, so we do that here.
2282 if (!HaveFullGlobalModuleIndex && GlobalIndex && !buildingModule()) {
2284 bool RecreateIndex = false;
2286 E = MMap.module_end(); I != E; ++I) {
2287 Module *TheModule = I->second;
2288 OptionalFileEntryRef Entry = TheModule->getASTFile();
2289 if (!Entry) {
2291 Path.emplace_back(TriggerLoc,
2292 getPreprocessor().getIdentifierInfo(TheModule->Name));
2293 std::reverse(Path.begin(), Path.end());
2294 // Load a module as hidden. This also adds it to the global index.
2295 loadModule(TheModule->DefinitionLoc, Path, Module::Hidden, false);
2296 RecreateIndex = true;
2297 }
2298 }
2299 if (RecreateIndex) {
2300 if (llvm::Error Err = GlobalModuleIndex::writeIndex(
2302 getPreprocessor().getHeaderSearchInfo().getModuleCachePath())) {
2303 // FIXME As above, this drops the error on the floor.
2304 consumeError(std::move(Err));
2305 return nullptr;
2306 }
2307 TheASTReader->resetForReload();
2308 TheASTReader->loadGlobalIndex();
2309 GlobalIndex = TheASTReader->getGlobalIndex();
2310 }
2311 HaveFullGlobalModuleIndex = true;
2312 }
2313 return GlobalIndex;
2314}
2315
2316// Check global module index for missing imports.
2317bool
2319 SourceLocation TriggerLoc) {
2320 // Look for the symbol in non-imported modules, but only if an error
2321 // actually occurred.
2322 if (!buildingModule()) {
2323 // Load global module index, or retrieve a previously loaded one.
2325 TriggerLoc);
2326
2327 // Only if we have a global index.
2328 if (GlobalIndex) {
2329 GlobalModuleIndex::HitSet FoundModules;
2330
2331 // Find the modules that reference the identifier.
2332 // Note that this only finds top-level modules.
2333 // We'll let diagnoseTypo find the actual declaration module.
2334 if (GlobalIndex->lookupIdentifier(Name, FoundModules))
2335 return true;
2336 }
2337 }
2338
2339 return false;
2340}
2341void CompilerInstance::resetAndLeakSema() { llvm::BuryPointer(takeSema()); }
2342
2345 ExternalSemaSrc = std::move(ESS);
2346}
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 void pruneModuleCache(const HeaderSearchOptions &HSOpts)
Prune the module cache of modules that haven't been accessed in a long time.
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 writeTimestampFile(StringRef TimestampFile)
Write a new timestamp file with the given path.
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:48
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:188
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:1920
@ ARR_Missing
The client can handle an AST file that cannot load because it is missing.
Definition ASTReader.h:1833
@ ARR_None
The client can't handle any AST loading failures.
Definition ASTReader.h:1829
@ ARR_ConfigurationMismatch
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
Definition ASTReader.h:1846
@ 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:1837
@ 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:1850
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 createSourceManager(FileManager &FileMgr)
Create the source manager and replace any existing one with it.
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()
std::unique_ptr< CompilerInstance > cloneForModuleCompile(SourceLocation ImportLoc, Module *Module, StringRef ModuleFileName, std::optional< ThreadSafeCloneConfig > ThreadSafeConfig=std::nullopt)
Creates a new CompilerInstance for compiling a module.
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 setVirtualFileSystem(IntrusiveRefCntPtr< llvm::vfs::FileSystem > FS)
Use the given file system.
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.
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.
CompilerInvocation & getInvocation()
void setVerboseOutputStream(raw_ostream &Value)
Replace the current stream for verbose output.
PreprocessorOptions & getPreprocessorOpts()
FileManager * createFileManager()
Create the file manager and replace any existing one with it.
ASTConsumer & getASTConsumer() const
void setFileManager(IntrusiveRefCntPtr< FileManager > Value)
Replace the current file manager and virtual file system.
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 getModuleHash() const
Retrieve a module hash string that is suitable for uniquely identifying the conditions under which th...
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:231
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
bool hasErrorOccurred() const
Definition Diagnostic.h:871
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:614
DiagnosticConsumer * getClient()
Definition Diagnostic.h:606
Level getDiagnosticLevel(unsigned DiagID, SourceLocation Loc) const
Based on the way the client configured the DiagnosticsEngine object, classify the specified diagnosti...
Definition Diagnostic.h:965
bool ownsClient() const
Determine whether this DiagnosticsEngine object own its client.
Definition Diagnostic.h:610
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:350
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 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:139
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...
unsigned ModuleCachePruneInterval
The interval (in seconds) between pruning operations.
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.
std::string ModuleCachePath
The directory used for the module cache.
unsigned ModulesValidateOncePerBuildSession
If true, skip verifying input files used by modules if the module was already verified during this bu...
unsigned ModuleCachePruneAfter
The time (in seconds) after which an unused module file will be considered unused and will,...
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:26
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.
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:853
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:784
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual void setAuxTarget(const TargetInfo *Aux)
void noSignedCharForObjCBool()
Definition TargetInfo.h:936
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...
@ PluginAction
Run a plugin action,.
@ RewriteObjC
ObjC->C Rewriter.
bool Inv(InterpState &S, CodePtr OpPC)
Definition Interp.h:738
@ 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.
@ HeaderSearch
Remove unused header search paths including header maps.
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
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
IntrusiveRefCntPtr< ModuleCache > createCrossProcessModuleCache()
Creates new ModuleCache backed by a file system directory that may be operated on by multiple process...
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:1745
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.