clang 20.0.0git
FrontendActions.cpp
Go to the documentation of this file.
1//===--- FrontendActions.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
11#include "clang/AST/Decl.h"
14#include "clang/Basic/Module.h"
29#include "llvm/Config/llvm-config.h" // for LLVM_HOST_TRIPLE
30#include "llvm/Support/ErrorHandling.h"
31#include "llvm/Support/FileSystem.h"
32#include "llvm/Support/MemoryBuffer.h"
33#include "llvm/Support/Path.h"
34#include "llvm/Support/YAMLTraits.h"
35#include "llvm/Support/raw_ostream.h"
36#include <memory>
37#include <optional>
38#include <system_error>
39
40using namespace clang;
41
42namespace {
43CodeCompleteConsumer *GetCodeCompletionConsumer(CompilerInstance &CI) {
45 : nullptr;
46}
47
48void EnsureSemaIsCreated(CompilerInstance &CI, FrontendAction &Action) {
49 if (Action.hasCodeCompletionSupport() &&
52
53 if (!CI.hasSema())
55 GetCodeCompletionConsumer(CI));
56}
57} // namespace
58
59//===----------------------------------------------------------------------===//
60// Custom Actions
61//===----------------------------------------------------------------------===//
62
63std::unique_ptr<ASTConsumer>
64InitOnlyAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {
65 return std::make_unique<ASTConsumer>();
66}
67
68void InitOnlyAction::ExecuteAction() {
69}
70
71// Basically PreprocessOnlyAction::ExecuteAction.
72void ReadPCHAndPreprocessAction::ExecuteAction() {
74
75 // Ignore unknown pragmas.
76 PP.IgnorePragmas();
77
78 Token Tok;
79 // Start parsing the specified input file.
81 do {
82 PP.Lex(Tok);
83 } while (Tok.isNot(tok::eof));
84}
85
86std::unique_ptr<ASTConsumer>
87ReadPCHAndPreprocessAction::CreateASTConsumer(CompilerInstance &CI,
88 StringRef InFile) {
89 return std::make_unique<ASTConsumer>();
90}
91
92//===----------------------------------------------------------------------===//
93// AST Consumer Actions
94//===----------------------------------------------------------------------===//
95
96std::unique_ptr<ASTConsumer>
98 if (std::unique_ptr<raw_ostream> OS =
99 CI.createDefaultOutputFile(false, InFile))
100 return CreateASTPrinter(std::move(OS), CI.getFrontendOpts().ASTDumpFilter);
101 return nullptr;
102}
103
104std::unique_ptr<ASTConsumer>
106 const FrontendOptions &Opts = CI.getFrontendOpts();
107 return CreateASTDumper(nullptr /*Dump to stdout.*/, Opts.ASTDumpFilter,
108 Opts.ASTDumpDecls, Opts.ASTDumpAll,
110 Opts.ASTDumpFormat);
111}
112
113std::unique_ptr<ASTConsumer>
116}
117
118std::unique_ptr<ASTConsumer>
120 return CreateASTViewer();
121}
122
123std::unique_ptr<ASTConsumer>
125 std::string Sysroot;
126 if (!ComputeASTConsumerArguments(CI, /*ref*/ Sysroot))
127 return nullptr;
128
129 std::string OutputFile;
130 std::unique_ptr<raw_pwrite_stream> OS =
131 CreateOutputFile(CI, InFile, /*ref*/ OutputFile);
132 if (!OS)
133 return nullptr;
134
136 Sysroot.clear();
137
138 const auto &FrontendOpts = CI.getFrontendOpts();
139 auto Buffer = std::make_shared<PCHBuffer>();
140 std::vector<std::unique_ptr<ASTConsumer>> Consumers;
141 Consumers.push_back(std::make_unique<PCHGenerator>(
142 CI.getPreprocessor(), CI.getModuleCache(), OutputFile, Sysroot, Buffer,
143 FrontendOpts.ModuleFileExtensions,
145 FrontendOpts.IncludeTimestamps, FrontendOpts.BuildingImplicitModule,
146 +CI.getLangOpts().CacheGeneratedPCH));
147 Consumers.push_back(CI.getPCHContainerWriter().CreatePCHContainerGenerator(
148 CI, std::string(InFile), OutputFile, std::move(OS), Buffer));
149
150 return std::make_unique<MultiplexConsumer>(std::move(Consumers));
151}
152
154 std::string &Sysroot) {
155 Sysroot = CI.getHeaderSearchOpts().Sysroot;
156 if (CI.getFrontendOpts().RelocatablePCH && Sysroot.empty()) {
157 CI.getDiagnostics().Report(diag::err_relocatable_without_isysroot);
158 return false;
159 }
160
161 return true;
162}
163
164std::unique_ptr<llvm::raw_pwrite_stream>
166 std::string &OutputFile) {
167 // Because this is exposed via libclang we must disable RemoveFileOnSignal.
168 std::unique_ptr<raw_pwrite_stream> OS = CI.createDefaultOutputFile(
169 /*Binary=*/true, InFile, /*Extension=*/"", /*RemoveFileOnSignal=*/false);
170 if (!OS)
171 return nullptr;
172
173 OutputFile = CI.getFrontendOpts().OutputFile;
174 return OS;
175}
176
178 if (getCompilerInstance().getPreprocessorOpts().AllowPCHWithCompilerErrors)
179 return false;
181}
182
184 CI.getLangOpts().CompilingPCH = true;
185 return true;
186}
187
188std::vector<std::unique_ptr<ASTConsumer>>
190 StringRef InFile) {
191 std::unique_ptr<raw_pwrite_stream> OS = CreateOutputFile(CI, InFile);
192 if (!OS)
193 return {};
194
195 std::string OutputFile = CI.getFrontendOpts().OutputFile;
196 std::string Sysroot;
197
198 auto Buffer = std::make_shared<PCHBuffer>();
199 std::vector<std::unique_ptr<ASTConsumer>> Consumers;
200
201 Consumers.push_back(std::make_unique<PCHGenerator>(
202 CI.getPreprocessor(), CI.getModuleCache(), OutputFile, Sysroot, Buffer,
204 /*AllowASTWithErrors=*/
206 /*IncludeTimestamps=*/
209 /*BuildingImplicitModule=*/+CI.getFrontendOpts().BuildingImplicitModule,
210 /*ShouldCacheASTInMemory=*/
212 Consumers.push_back(CI.getPCHContainerWriter().CreatePCHContainerGenerator(
213 CI, std::string(InFile), OutputFile, std::move(OS), Buffer));
214 return Consumers;
215}
216
217std::unique_ptr<ASTConsumer>
219 StringRef InFile) {
220 std::vector<std::unique_ptr<ASTConsumer>> Consumers =
221 CreateMultiplexConsumer(CI, InFile);
222 if (Consumers.empty())
223 return nullptr;
224
225 return std::make_unique<MultiplexConsumer>(std::move(Consumers));
226}
227
231}
232
233bool GenerateModuleFromModuleMapAction::BeginSourceFileAction(
234 CompilerInstance &CI) {
235 if (!CI.getLangOpts().Modules) {
236 CI.getDiagnostics().Report(diag::err_module_build_requires_fmodules);
237 return false;
238 }
239
241}
242
243std::unique_ptr<raw_pwrite_stream>
244GenerateModuleFromModuleMapAction::CreateOutputFile(CompilerInstance &CI,
245 StringRef InFile) {
246 // If no output file was provided, figure out where this module would go
247 // in the module cache.
248 if (CI.getFrontendOpts().OutputFile.empty()) {
249 StringRef ModuleMapFile = CI.getFrontendOpts().OriginalModuleMap;
250 if (ModuleMapFile.empty())
251 ModuleMapFile = InFile;
252
256 ModuleMapFile);
257 }
258
259 // Because this is exposed via libclang we must disable RemoveFileOnSignal.
260 return CI.createDefaultOutputFile(/*Binary=*/true, InFile, /*Extension=*/"",
261 /*RemoveFileOnSignal=*/false,
262 /*CreateMissingDirectories=*/true,
263 /*ForceUseTemporary=*/true);
264}
265
267 CompilerInstance &CI) {
268 CI.getLangOpts().setCompilingModule(LangOptions::CMK_ModuleInterface);
269
271}
272
273std::unique_ptr<ASTConsumer>
275 StringRef InFile) {
276 std::vector<std::unique_ptr<ASTConsumer>> Consumers;
277
279 !CI.getFrontendOpts().ModuleOutputPath.empty()) {
280 Consumers.push_back(std::make_unique<ReducedBMIGenerator>(
284 }
285
286 Consumers.push_back(std::make_unique<CXX20ModulesGenerator>(
290
291 return std::make_unique<MultiplexConsumer>(std::move(Consumers));
292}
293
294std::unique_ptr<raw_pwrite_stream>
296 StringRef InFile) {
297 return CI.createDefaultOutputFile(/*Binary=*/true, InFile, "pcm");
298}
299
300std::unique_ptr<ASTConsumer>
301GenerateReducedModuleInterfaceAction::CreateASTConsumer(CompilerInstance &CI,
302 StringRef InFile) {
303 return std::make_unique<ReducedBMIGenerator>(CI.getPreprocessor(),
304 CI.getModuleCache(),
306}
307
308bool GenerateHeaderUnitAction::BeginSourceFileAction(CompilerInstance &CI) {
309 if (!CI.getLangOpts().CPlusPlusModules) {
310 CI.getDiagnostics().Report(diag::err_module_interface_requires_cpp_modules);
311 return false;
312 }
313 CI.getLangOpts().setCompilingModule(LangOptions::CMK_HeaderUnit);
315}
316
317std::unique_ptr<raw_pwrite_stream>
318GenerateHeaderUnitAction::CreateOutputFile(CompilerInstance &CI,
319 StringRef InFile) {
320 return CI.createDefaultOutputFile(/*Binary=*/true, InFile, "pcm");
321}
322
324}
325
326std::unique_ptr<ASTConsumer>
328 return std::make_unique<ASTConsumer>();
329}
330
331std::unique_ptr<ASTConsumer>
333 StringRef InFile) {
334 return std::make_unique<ASTConsumer>();
335}
336
337std::unique_ptr<ASTConsumer>
339 return std::make_unique<ASTConsumer>();
340}
341
345 const std::string &Sysroot = CI.getHeaderSearchOpts().Sysroot;
346 std::unique_ptr<ASTReader> Reader(new ASTReader(
349 Sysroot.empty() ? "" : Sysroot.c_str(),
351 /*AllowASTWithCompilerErrors*/ false,
352 /*AllowConfigurationMismatch*/ true,
353 /*ValidateSystemInputs*/ true));
354
355 Reader->ReadAST(getCurrentFile(),
360}
361
362namespace {
363struct TemplightEntry {
364 std::string Name;
365 std::string Kind;
366 std::string Event;
367 std::string DefinitionLocation;
368 std::string PointOfInstantiation;
369};
370} // namespace
371
372namespace llvm {
373namespace yaml {
374template <> struct MappingTraits<TemplightEntry> {
375 static void mapping(IO &io, TemplightEntry &fields) {
376 io.mapRequired("name", fields.Name);
377 io.mapRequired("kind", fields.Kind);
378 io.mapRequired("event", fields.Event);
379 io.mapRequired("orig", fields.DefinitionLocation);
380 io.mapRequired("poi", fields.PointOfInstantiation);
381 }
382};
383} // namespace yaml
384} // namespace llvm
385
386namespace {
387class DefaultTemplateInstCallback : public TemplateInstantiationCallback {
388 using CodeSynthesisContext = Sema::CodeSynthesisContext;
389
390public:
391 void initialize(const Sema &) override {}
392
393 void finalize(const Sema &) override {}
394
395 void atTemplateBegin(const Sema &TheSema,
396 const CodeSynthesisContext &Inst) override {
397 displayTemplightEntry<true>(llvm::outs(), TheSema, Inst);
398 }
399
400 void atTemplateEnd(const Sema &TheSema,
401 const CodeSynthesisContext &Inst) override {
402 displayTemplightEntry<false>(llvm::outs(), TheSema, Inst);
403 }
404
405private:
406 static std::string toString(CodeSynthesisContext::SynthesisKind Kind) {
407 switch (Kind) {
408 case CodeSynthesisContext::TemplateInstantiation:
409 return "TemplateInstantiation";
410 case CodeSynthesisContext::DefaultTemplateArgumentInstantiation:
411 return "DefaultTemplateArgumentInstantiation";
412 case CodeSynthesisContext::DefaultFunctionArgumentInstantiation:
413 return "DefaultFunctionArgumentInstantiation";
414 case CodeSynthesisContext::ExplicitTemplateArgumentSubstitution:
415 return "ExplicitTemplateArgumentSubstitution";
416 case CodeSynthesisContext::DeducedTemplateArgumentSubstitution:
417 return "DeducedTemplateArgumentSubstitution";
418 case CodeSynthesisContext::LambdaExpressionSubstitution:
419 return "LambdaExpressionSubstitution";
420 case CodeSynthesisContext::PriorTemplateArgumentSubstitution:
421 return "PriorTemplateArgumentSubstitution";
422 case CodeSynthesisContext::DefaultTemplateArgumentChecking:
423 return "DefaultTemplateArgumentChecking";
424 case CodeSynthesisContext::ExceptionSpecEvaluation:
425 return "ExceptionSpecEvaluation";
426 case CodeSynthesisContext::ExceptionSpecInstantiation:
427 return "ExceptionSpecInstantiation";
428 case CodeSynthesisContext::DeclaringSpecialMember:
429 return "DeclaringSpecialMember";
430 case CodeSynthesisContext::DeclaringImplicitEqualityComparison:
431 return "DeclaringImplicitEqualityComparison";
432 case CodeSynthesisContext::DefiningSynthesizedFunction:
433 return "DefiningSynthesizedFunction";
434 case CodeSynthesisContext::RewritingOperatorAsSpaceship:
435 return "RewritingOperatorAsSpaceship";
436 case CodeSynthesisContext::Memoization:
437 return "Memoization";
438 case CodeSynthesisContext::ConstraintsCheck:
439 return "ConstraintsCheck";
440 case CodeSynthesisContext::ConstraintSubstitution:
441 return "ConstraintSubstitution";
442 case CodeSynthesisContext::ConstraintNormalization:
443 return "ConstraintNormalization";
444 case CodeSynthesisContext::RequirementParameterInstantiation:
445 return "RequirementParameterInstantiation";
446 case CodeSynthesisContext::ParameterMappingSubstitution:
447 return "ParameterMappingSubstitution";
448 case CodeSynthesisContext::RequirementInstantiation:
449 return "RequirementInstantiation";
450 case CodeSynthesisContext::NestedRequirementConstraintsCheck:
451 return "NestedRequirementConstraintsCheck";
452 case CodeSynthesisContext::InitializingStructuredBinding:
453 return "InitializingStructuredBinding";
454 case CodeSynthesisContext::MarkingClassDllexported:
455 return "MarkingClassDllexported";
456 case CodeSynthesisContext::BuildingBuiltinDumpStructCall:
457 return "BuildingBuiltinDumpStructCall";
458 case CodeSynthesisContext::BuildingDeductionGuides:
459 return "BuildingDeductionGuides";
460 case CodeSynthesisContext::TypeAliasTemplateInstantiation:
461 return "TypeAliasTemplateInstantiation";
462 }
463 return "";
464 }
465
466 template <bool BeginInstantiation>
467 static void displayTemplightEntry(llvm::raw_ostream &Out, const Sema &TheSema,
468 const CodeSynthesisContext &Inst) {
469 std::string YAML;
470 {
471 llvm::raw_string_ostream OS(YAML);
472 llvm::yaml::Output YO(OS);
473 TemplightEntry Entry =
474 getTemplightEntry<BeginInstantiation>(TheSema, Inst);
475 llvm::yaml::EmptyContext Context;
476 llvm::yaml::yamlize(YO, Entry, true, Context);
477 }
478 Out << "---" << YAML << "\n";
479 }
480
481 static void printEntryName(const Sema &TheSema, const Decl *Entity,
482 llvm::raw_string_ostream &OS) {
483 auto *NamedTemplate = cast<NamedDecl>(Entity);
484
485 PrintingPolicy Policy = TheSema.Context.getPrintingPolicy();
486 // FIXME: Also ask for FullyQualifiedNames?
487 Policy.SuppressDefaultTemplateArgs = false;
488 NamedTemplate->getNameForDiagnostic(OS, Policy, true);
489
490 if (!OS.str().empty())
491 return;
492
493 Decl *Ctx = Decl::castFromDeclContext(NamedTemplate->getDeclContext());
494 NamedDecl *NamedCtx = dyn_cast_or_null<NamedDecl>(Ctx);
495
496 if (const auto *Decl = dyn_cast<TagDecl>(NamedTemplate)) {
497 if (const auto *R = dyn_cast<RecordDecl>(Decl)) {
498 if (R->isLambda()) {
499 OS << "lambda at ";
500 Decl->getLocation().print(OS, TheSema.getSourceManager());
501 return;
502 }
503 }
504 OS << "unnamed " << Decl->getKindName();
505 return;
506 }
507
508 assert(NamedCtx && "NamedCtx cannot be null");
509
510 if (const auto *Decl = dyn_cast<ParmVarDecl>(NamedTemplate)) {
511 OS << "unnamed function parameter " << Decl->getFunctionScopeIndex()
512 << " ";
513 if (Decl->getFunctionScopeDepth() > 0)
514 OS << "(at depth " << Decl->getFunctionScopeDepth() << ") ";
515 OS << "of ";
516 NamedCtx->getNameForDiagnostic(OS, TheSema.getLangOpts(), true);
517 return;
518 }
519
520 if (const auto *Decl = dyn_cast<TemplateTypeParmDecl>(NamedTemplate)) {
521 if (const Type *Ty = Decl->getTypeForDecl()) {
522 if (const auto *TTPT = dyn_cast_or_null<TemplateTypeParmType>(Ty)) {
523 OS << "unnamed template type parameter " << TTPT->getIndex() << " ";
524 if (TTPT->getDepth() > 0)
525 OS << "(at depth " << TTPT->getDepth() << ") ";
526 OS << "of ";
527 NamedCtx->getNameForDiagnostic(OS, TheSema.getLangOpts(), true);
528 return;
529 }
530 }
531 }
532
533 if (const auto *Decl = dyn_cast<NonTypeTemplateParmDecl>(NamedTemplate)) {
534 OS << "unnamed template non-type parameter " << Decl->getIndex() << " ";
535 if (Decl->getDepth() > 0)
536 OS << "(at depth " << Decl->getDepth() << ") ";
537 OS << "of ";
538 NamedCtx->getNameForDiagnostic(OS, TheSema.getLangOpts(), true);
539 return;
540 }
541
542 if (const auto *Decl = dyn_cast<TemplateTemplateParmDecl>(NamedTemplate)) {
543 OS << "unnamed template template parameter " << Decl->getIndex() << " ";
544 if (Decl->getDepth() > 0)
545 OS << "(at depth " << Decl->getDepth() << ") ";
546 OS << "of ";
547 NamedCtx->getNameForDiagnostic(OS, TheSema.getLangOpts(), true);
548 return;
549 }
550
551 llvm_unreachable("Failed to retrieve a name for this entry!");
552 OS << "unnamed identifier";
553 }
554
555 template <bool BeginInstantiation>
556 static TemplightEntry getTemplightEntry(const Sema &TheSema,
557 const CodeSynthesisContext &Inst) {
558 TemplightEntry Entry;
559 Entry.Kind = toString(Inst.Kind);
560 Entry.Event = BeginInstantiation ? "Begin" : "End";
561 llvm::raw_string_ostream OS(Entry.Name);
562 printEntryName(TheSema, Inst.Entity, OS);
563 const PresumedLoc DefLoc =
564 TheSema.getSourceManager().getPresumedLoc(Inst.Entity->getLocation());
565 if (!DefLoc.isInvalid())
566 Entry.DefinitionLocation = std::string(DefLoc.getFilename()) + ":" +
567 std::to_string(DefLoc.getLine()) + ":" +
568 std::to_string(DefLoc.getColumn());
569 const PresumedLoc PoiLoc =
570 TheSema.getSourceManager().getPresumedLoc(Inst.PointOfInstantiation);
571 if (!PoiLoc.isInvalid()) {
572 Entry.PointOfInstantiation = std::string(PoiLoc.getFilename()) + ":" +
573 std::to_string(PoiLoc.getLine()) + ":" +
574 std::to_string(PoiLoc.getColumn());
575 }
576 return Entry;
577 }
578};
579} // namespace
580
581std::unique_ptr<ASTConsumer>
583 return std::make_unique<ASTConsumer>();
584}
585
588
589 // This part is normally done by ASTFrontEndAction, but needs to happen
590 // before Templight observers can be created
591 // FIXME: Move the truncation aspect of this into Sema, we delayed this till
592 // here so the source manager would be initialized.
593 EnsureSemaIsCreated(CI, *this);
594
595 CI.getSema().TemplateInstCallbacks.push_back(
596 std::make_unique<DefaultTemplateInstCallback>());
598}
599
600namespace {
601 /// AST reader listener that dumps module information for a module
602 /// file.
603 class DumpModuleInfoListener : public ASTReaderListener {
604 llvm::raw_ostream &Out;
605
606 public:
607 DumpModuleInfoListener(llvm::raw_ostream &Out) : Out(Out) { }
608
609#define DUMP_BOOLEAN(Value, Text) \
610 Out.indent(4) << Text << ": " << (Value? "Yes" : "No") << "\n"
611
612 bool ReadFullVersionInformation(StringRef FullVersion) override {
613 Out.indent(2)
614 << "Generated by "
615 << (FullVersion == getClangFullRepositoryVersion()? "this"
616 : "a different")
617 << " Clang: " << FullVersion << "\n";
619 }
620
621 void ReadModuleName(StringRef ModuleName) override {
622 Out.indent(2) << "Module name: " << ModuleName << "\n";
623 }
624 void ReadModuleMapFile(StringRef ModuleMapPath) override {
625 Out.indent(2) << "Module map file: " << ModuleMapPath << "\n";
626 }
627
628 bool ReadLanguageOptions(const LangOptions &LangOpts,
629 StringRef ModuleFilename, bool Complain,
630 bool AllowCompatibleDifferences) override {
631 Out.indent(2) << "Language options:\n";
632#define LANGOPT(Name, Bits, Default, Description) \
633 DUMP_BOOLEAN(LangOpts.Name, Description);
634#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
635 Out.indent(4) << Description << ": " \
636 << static_cast<unsigned>(LangOpts.get##Name()) << "\n";
637#define VALUE_LANGOPT(Name, Bits, Default, Description) \
638 Out.indent(4) << Description << ": " << LangOpts.Name << "\n";
639#define BENIGN_LANGOPT(Name, Bits, Default, Description)
640#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
641#include "clang/Basic/LangOptions.def"
642
643 if (!LangOpts.ModuleFeatures.empty()) {
644 Out.indent(4) << "Module features:\n";
645 for (StringRef Feature : LangOpts.ModuleFeatures)
646 Out.indent(6) << Feature << "\n";
647 }
648
649 return false;
650 }
651
652 bool ReadTargetOptions(const TargetOptions &TargetOpts,
653 StringRef ModuleFilename, bool Complain,
654 bool AllowCompatibleDifferences) override {
655 Out.indent(2) << "Target options:\n";
656 Out.indent(4) << " Triple: " << TargetOpts.Triple << "\n";
657 Out.indent(4) << " CPU: " << TargetOpts.CPU << "\n";
658 Out.indent(4) << " TuneCPU: " << TargetOpts.TuneCPU << "\n";
659 Out.indent(4) << " ABI: " << TargetOpts.ABI << "\n";
660
661 if (!TargetOpts.FeaturesAsWritten.empty()) {
662 Out.indent(4) << "Target features:\n";
663 for (unsigned I = 0, N = TargetOpts.FeaturesAsWritten.size();
664 I != N; ++I) {
665 Out.indent(6) << TargetOpts.FeaturesAsWritten[I] << "\n";
666 }
667 }
668
669 return false;
670 }
671
672 bool ReadDiagnosticOptions(IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts,
673 StringRef ModuleFilename,
674 bool Complain) override {
675 Out.indent(2) << "Diagnostic options:\n";
676#define DIAGOPT(Name, Bits, Default) DUMP_BOOLEAN(DiagOpts->Name, #Name);
677#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
678 Out.indent(4) << #Name << ": " << DiagOpts->get##Name() << "\n";
679#define VALUE_DIAGOPT(Name, Bits, Default) \
680 Out.indent(4) << #Name << ": " << DiagOpts->Name << "\n";
681#include "clang/Basic/DiagnosticOptions.def"
682
683 Out.indent(4) << "Diagnostic flags:\n";
684 for (const std::string &Warning : DiagOpts->Warnings)
685 Out.indent(6) << "-W" << Warning << "\n";
686 for (const std::string &Remark : DiagOpts->Remarks)
687 Out.indent(6) << "-R" << Remark << "\n";
688
689 return false;
690 }
691
692 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
693 StringRef ModuleFilename,
694 StringRef SpecificModuleCachePath,
695 bool Complain) override {
696 Out.indent(2) << "Header search options:\n";
697 Out.indent(4) << "System root [-isysroot=]: '" << HSOpts.Sysroot << "'\n";
698 Out.indent(4) << "Resource dir [ -resource-dir=]: '" << HSOpts.ResourceDir << "'\n";
699 Out.indent(4) << "Module Cache: '" << SpecificModuleCachePath << "'\n";
701 "Use builtin include directories [-nobuiltininc]");
703 "Use standard system include directories [-nostdinc]");
705 "Use standard C++ include directories [-nostdinc++]");
706 DUMP_BOOLEAN(HSOpts.UseLibcxx,
707 "Use libc++ (rather than libstdc++) [-stdlib=]");
708 return false;
709 }
710
711 bool ReadHeaderSearchPaths(const HeaderSearchOptions &HSOpts,
712 bool Complain) override {
713 Out.indent(2) << "Header search paths:\n";
714 Out.indent(4) << "User entries:\n";
715 for (const auto &Entry : HSOpts.UserEntries)
716 Out.indent(6) << Entry.Path << "\n";
717 Out.indent(4) << "System header prefixes:\n";
718 for (const auto &Prefix : HSOpts.SystemHeaderPrefixes)
719 Out.indent(6) << Prefix.Prefix << "\n";
720 Out.indent(4) << "VFS overlay files:\n";
721 for (const auto &Overlay : HSOpts.VFSOverlayFiles)
722 Out.indent(6) << Overlay << "\n";
723 return false;
724 }
725
726 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
727 StringRef ModuleFilename, bool ReadMacros,
728 bool Complain,
729 std::string &SuggestedPredefines) override {
730 Out.indent(2) << "Preprocessor options:\n";
732 "Uses compiler/target-specific predefines [-undef]");
734 "Uses detailed preprocessing record (for indexing)");
735
736 if (ReadMacros) {
737 Out.indent(4) << "Predefined macros:\n";
738 }
739
740 for (std::vector<std::pair<std::string, bool/*isUndef*/> >::const_iterator
741 I = PPOpts.Macros.begin(), IEnd = PPOpts.Macros.end();
742 I != IEnd; ++I) {
743 Out.indent(6);
744 if (I->second)
745 Out << "-U";
746 else
747 Out << "-D";
748 Out << I->first << "\n";
749 }
750 return false;
751 }
752
753 /// Indicates that a particular module file extension has been read.
754 void readModuleFileExtension(
755 const ModuleFileExtensionMetadata &Metadata) override {
756 Out.indent(2) << "Module file extension '"
757 << Metadata.BlockName << "' " << Metadata.MajorVersion
758 << "." << Metadata.MinorVersion;
759 if (!Metadata.UserInfo.empty()) {
760 Out << ": ";
761 Out.write_escaped(Metadata.UserInfo);
762 }
763
764 Out << "\n";
765 }
766
767 /// Tells the \c ASTReaderListener that we want to receive the
768 /// input files of the AST file via \c visitInputFile.
769 bool needsInputFileVisitation() override { return true; }
770
771 /// Tells the \c ASTReaderListener that we want to receive the
772 /// input files of the AST file via \c visitInputFile.
773 bool needsSystemInputFileVisitation() override { return true; }
774
775 /// Indicates that the AST file contains particular input file.
776 ///
777 /// \returns true to continue receiving the next input file, false to stop.
778 bool visitInputFile(StringRef Filename, bool isSystem,
779 bool isOverridden, bool isExplicitModule) override {
780
781 Out.indent(2) << "Input file: " << Filename;
782
783 if (isSystem || isOverridden || isExplicitModule) {
784 Out << " [";
785 if (isSystem) {
786 Out << "System";
787 if (isOverridden || isExplicitModule)
788 Out << ", ";
789 }
790 if (isOverridden) {
791 Out << "Overridden";
792 if (isExplicitModule)
793 Out << ", ";
794 }
795 if (isExplicitModule)
796 Out << "ExplicitModule";
797
798 Out << "]";
799 }
800
801 Out << "\n";
802
803 return true;
804 }
805
806 /// Returns true if this \c ASTReaderListener wants to receive the
807 /// imports of the AST file via \c visitImport, false otherwise.
808 bool needsImportVisitation() const override { return true; }
809
810 /// If needsImportVisitation returns \c true, this is called for each
811 /// AST file imported by this AST file.
812 void visitImport(StringRef ModuleName, StringRef Filename) override {
813 Out.indent(2) << "Imports module '" << ModuleName
814 << "': " << Filename.str() << "\n";
815 }
816#undef DUMP_BOOLEAN
817 };
818}
819
821 // The Object file reader also supports raw ast files and there is no point in
822 // being strict about the module file format in -module-file-info mode.
824 return true;
825}
826
827static StringRef ModuleKindName(Module::ModuleKind MK) {
828 switch (MK) {
830 return "Module Map Module";
832 return "Interface Unit";
834 return "Implementation Unit";
836 return "Partition Interface";
838 return "Partition Implementation";
840 return "Header Unit";
842 return "Global Module Fragment";
844 return "Implicit Module Fragment";
846 return "Private Module Fragment";
847 }
848 llvm_unreachable("unknown module kind!");
849}
850
853
854 // Don't process files of type other than module to avoid crash
855 if (!isCurrentFileAST()) {
856 CI.getDiagnostics().Report(diag::err_file_is_not_module)
857 << getCurrentFile();
858 return;
859 }
860
861 // Set up the output file.
862 StringRef OutputFileName = CI.getFrontendOpts().OutputFile;
863 if (!OutputFileName.empty() && OutputFileName != "-") {
864 std::error_code EC;
865 OutputStream.reset(new llvm::raw_fd_ostream(
866 OutputFileName.str(), EC, llvm::sys::fs::OF_TextWithCRLF));
867 }
868 llvm::raw_ostream &Out = OutputStream ? *OutputStream : llvm::outs();
869
870 Out << "Information for module file '" << getCurrentFile() << "':\n";
871 auto &FileMgr = CI.getFileManager();
872 auto Buffer = FileMgr.getBufferForFile(getCurrentFile());
873 StringRef Magic = (*Buffer)->getMemBufferRef().getBuffer();
874 bool IsRaw = Magic.starts_with("CPCH");
875 Out << " Module format: " << (IsRaw ? "raw" : "obj") << "\n";
876
877 Preprocessor &PP = CI.getPreprocessor();
878 DumpModuleInfoListener Listener(Out);
879 HeaderSearchOptions &HSOpts = PP.getHeaderSearchInfo().getHeaderSearchOpts();
880
881 // The FrontendAction::BeginSourceFile () method loads the AST so that much
882 // of the information is already available and modules should have been
883 // loaded.
884
886 if (LO.CPlusPlusModules && !LO.CurrentModule.empty()) {
888 unsigned SubModuleCount = R->getTotalNumSubmodules();
890 Out << " ====== C++20 Module structure ======\n";
891
892 if (MF.ModuleName != LO.CurrentModule)
893 Out << " Mismatched module names : " << MF.ModuleName << " and "
894 << LO.CurrentModule << "\n";
895
896 struct SubModInfo {
897 unsigned Idx;
898 Module *Mod;
900 std::string &Name;
901 bool Seen;
902 };
903 std::map<std::string, SubModInfo> SubModMap;
904 auto PrintSubMapEntry = [&](std::string Name, Module::ModuleKind Kind) {
905 Out << " " << ModuleKindName(Kind) << " '" << Name << "'";
906 auto I = SubModMap.find(Name);
907 if (I == SubModMap.end())
908 Out << " was not found in the sub modules!\n";
909 else {
910 I->second.Seen = true;
911 Out << " is at index #" << I->second.Idx << "\n";
912 }
913 };
914 Module *Primary = nullptr;
915 for (unsigned Idx = 0; Idx <= SubModuleCount; ++Idx) {
916 Module *M = R->getModule(Idx);
917 if (!M)
918 continue;
919 if (M->Name == LO.CurrentModule) {
920 Primary = M;
921 Out << " " << ModuleKindName(M->Kind) << " '" << LO.CurrentModule
922 << "' is the Primary Module at index #" << Idx << "\n";
923 SubModMap.insert({M->Name, {Idx, M, M->Kind, M->Name, true}});
924 } else
925 SubModMap.insert({M->Name, {Idx, M, M->Kind, M->Name, false}});
926 }
927 if (Primary) {
928 if (!Primary->submodules().empty())
929 Out << " Sub Modules:\n";
930 for (auto *MI : Primary->submodules()) {
931 PrintSubMapEntry(MI->Name, MI->Kind);
932 }
933 if (!Primary->Imports.empty())
934 Out << " Imports:\n";
935 for (auto *IMP : Primary->Imports) {
936 PrintSubMapEntry(IMP->Name, IMP->Kind);
937 }
938 if (!Primary->Exports.empty())
939 Out << " Exports:\n";
940 for (unsigned MN = 0, N = Primary->Exports.size(); MN != N; ++MN) {
941 if (Module *M = Primary->Exports[MN].getPointer()) {
942 PrintSubMapEntry(M->Name, M->Kind);
943 }
944 }
945 }
946
947 // Emit the macro definitions in the module file so that we can know how
948 // much definitions in the module file quickly.
949 // TODO: Emit the macro definition bodies completely.
950 if (auto FilteredMacros = llvm::make_filter_range(
951 R->getPreprocessor().macros(),
952 [](const auto &Macro) { return Macro.first->isFromAST(); });
953 !FilteredMacros.empty()) {
954 Out << " Macro Definitions:\n";
955 for (/*<IdentifierInfo *, MacroState> pair*/ const auto &Macro :
956 FilteredMacros)
957 Out << " " << Macro.first->getName() << "\n";
958 }
959
960 // Now let's print out any modules we did not see as part of the Primary.
961 for (const auto &SM : SubModMap) {
962 if (!SM.second.Seen && SM.second.Mod) {
963 Out << " " << ModuleKindName(SM.second.Kind) << " '" << SM.first
964 << "' at index #" << SM.second.Idx
965 << " has no direct reference in the Primary\n";
966 }
967 }
968 Out << " ====== ======\n";
969 }
970
971 // The reminder of the output is produced from the listener as the AST
972 // FileCcontrolBlock is (re-)parsed.
974 getCurrentFile(), FileMgr, CI.getModuleCache(),
976 /*FindModuleFileExtensions=*/true, Listener,
978}
979
980//===----------------------------------------------------------------------===//
981// Preprocessor Actions
982//===----------------------------------------------------------------------===//
983
987
988 // Start lexing the specified input file.
989 llvm::MemoryBufferRef FromFile = SM.getBufferOrFake(SM.getMainFileID());
990 Lexer RawLex(SM.getMainFileID(), FromFile, SM, PP.getLangOpts());
991 RawLex.SetKeepWhitespaceMode(true);
992
993 Token RawTok;
994 RawLex.LexFromRawLexer(RawTok);
995 while (RawTok.isNot(tok::eof)) {
996 PP.DumpToken(RawTok, true);
997 llvm::errs() << "\n";
998 RawLex.LexFromRawLexer(RawTok);
999 }
1000}
1001
1004 // Start preprocessing the specified input file.
1005 Token Tok;
1007 do {
1008 PP.Lex(Tok);
1009 PP.DumpToken(Tok, true);
1010 llvm::errs() << "\n";
1011 } while (Tok.isNot(tok::eof));
1012}
1013
1016
1017 // Ignore unknown pragmas.
1018 PP.IgnorePragmas();
1019
1020 Token Tok;
1021 // Start parsing the specified input file.
1023 do {
1024 PP.Lex(Tok);
1025 } while (Tok.isNot(tok::eof));
1026}
1027
1030 // Output file may need to be set to 'Binary', to avoid converting Unix style
1031 // line feeds (<LF>) to Microsoft style line feeds (<CR><LF>) on Windows.
1032 //
1033 // Look to see what type of line endings the file uses. If there's a
1034 // CRLF, then we won't open the file up in binary mode. If there is
1035 // just an LF or CR, then we will open the file up in binary mode.
1036 // In this fashion, the output format should match the input format, unless
1037 // the input format has inconsistent line endings.
1038 //
1039 // This should be a relatively fast operation since most files won't have
1040 // all of their source code on a single line. However, that is still a
1041 // concern, so if we scan for too long, we'll just assume the file should
1042 // be opened in binary mode.
1043
1044 bool BinaryMode = false;
1045 if (llvm::Triple(LLVM_HOST_TRIPLE).isOSWindows()) {
1046 BinaryMode = true;
1047 const SourceManager &SM = CI.getSourceManager();
1048 if (std::optional<llvm::MemoryBufferRef> Buffer =
1049 SM.getBufferOrNone(SM.getMainFileID())) {
1050 const char *cur = Buffer->getBufferStart();
1051 const char *end = Buffer->getBufferEnd();
1052 const char *next = (cur != end) ? cur + 1 : end;
1053
1054 // Limit ourselves to only scanning 256 characters into the source
1055 // file. This is mostly a check in case the file has no
1056 // newlines whatsoever.
1057 if (end - cur > 256)
1058 end = cur + 256;
1059
1060 while (next < end) {
1061 if (*cur == 0x0D) { // CR
1062 if (*next == 0x0A) // CRLF
1063 BinaryMode = false;
1064
1065 break;
1066 } else if (*cur == 0x0A) // LF
1067 break;
1068
1069 ++cur;
1070 ++next;
1071 }
1072 }
1073 }
1074
1075 std::unique_ptr<raw_ostream> OS =
1077 if (!OS) return;
1078
1079 // If we're preprocessing a module map, start by dumping the contents of the
1080 // module itself before switching to the input buffer.
1081 auto &Input = getCurrentInput();
1082 if (Input.getKind().getFormat() == InputKind::ModuleMap) {
1083 if (Input.isFile()) {
1084 (*OS) << "# 1 \"";
1085 OS->write_escaped(Input.getFile());
1086 (*OS) << "\"\n";
1087 }
1088 getCurrentModule()->print(*OS);
1089 (*OS) << "#pragma clang module contents\n";
1090 }
1091
1094}
1095
1097 switch (getCurrentFileKind().getLanguage()) {
1098 case Language::C:
1099 case Language::CXX:
1100 case Language::ObjC:
1101 case Language::ObjCXX:
1102 case Language::OpenCL:
1104 case Language::CUDA:
1105 case Language::HIP:
1106 case Language::HLSL:
1107 case Language::CIR:
1108 break;
1109
1110 case Language::Unknown:
1111 case Language::Asm:
1112 case Language::LLVM_IR:
1113 // We can't do anything with these.
1114 return;
1115 }
1116
1117 // We don't expect to find any #include directives in a preprocessed input.
1118 if (getCurrentFileKind().isPreprocessed())
1119 return;
1120
1122 auto Buffer = CI.getFileManager().getBufferForFile(getCurrentFile());
1123 if (Buffer) {
1124 unsigned Preamble =
1125 Lexer::ComputePreamble((*Buffer)->getBuffer(), CI.getLangOpts()).Size;
1126 llvm::outs().write((*Buffer)->getBufferStart(), Preamble);
1127 }
1128}
1129
1130void DumpCompilerOptionsAction::ExecuteAction() {
1132 std::unique_ptr<raw_ostream> OSP =
1134 if (!OSP)
1135 return;
1136
1137 raw_ostream &OS = *OSP;
1138 const Preprocessor &PP = CI.getPreprocessor();
1139 const LangOptions &LangOpts = PP.getLangOpts();
1140
1141 // FIXME: Rather than manually format the JSON (which is awkward due to
1142 // needing to remove trailing commas), this should make use of a JSON library.
1143 // FIXME: Instead of printing enums as an integral value and specifying the
1144 // type as a separate field, use introspection to print the enumerator.
1145
1146 OS << "{\n";
1147 OS << "\n\"features\" : [\n";
1148 {
1150#define FEATURE(Name, Predicate) \
1151 ("\t{\"" #Name "\" : " + llvm::Twine(Predicate ? "true" : "false") + "},\n") \
1152 .toVector(Str);
1153#include "clang/Basic/Features.def"
1154#undef FEATURE
1155 // Remove the newline and comma from the last entry to ensure this remains
1156 // valid JSON.
1157 OS << Str.substr(0, Str.size() - 2);
1158 }
1159 OS << "\n],\n";
1160
1161 OS << "\n\"extensions\" : [\n";
1162 {
1164#define EXTENSION(Name, Predicate) \
1165 ("\t{\"" #Name "\" : " + llvm::Twine(Predicate ? "true" : "false") + "},\n") \
1166 .toVector(Str);
1167#include "clang/Basic/Features.def"
1168#undef EXTENSION
1169 // Remove the newline and comma from the last entry to ensure this remains
1170 // valid JSON.
1171 OS << Str.substr(0, Str.size() - 2);
1172 }
1173 OS << "\n]\n";
1174
1175 OS << "}";
1176}
1177
1181 llvm::MemoryBufferRef FromFile = SM.getBufferOrFake(SM.getMainFileID());
1182
1186 FromFile.getBuffer(), Tokens, Directives, &CI.getDiagnostics(),
1187 SM.getLocForStartOfFile(SM.getMainFileID()))) {
1188 assert(CI.getDiagnostics().hasErrorOccurred() &&
1189 "no errors reported for failure");
1190
1191 // Preprocess the source when verifying the diagnostics to capture the
1192 // 'expected' comments.
1193 if (CI.getDiagnosticOpts().VerifyDiagnostics) {
1194 // Make sure we don't emit new diagnostics!
1198 Token Tok;
1199 do {
1200 PP.Lex(Tok);
1201 } while (Tok.isNot(tok::eof));
1202 }
1203 return;
1204 }
1205 printDependencyDirectivesAsSource(FromFile.getBuffer(), Directives,
1206 llvm::outs());
1207}
1208
1209void GetDependenciesByModuleNameAction::ExecuteAction() {
1211 Preprocessor &PP = CI.getPreprocessor();
1213 FileID MainFileID = SM.getMainFileID();
1214 SourceLocation FileStart = SM.getLocForStartOfFile(MainFileID);
1216 IdentifierInfo *ModuleID = PP.getIdentifierInfo(ModuleName);
1217 Path.push_back(std::make_pair(ModuleID, FileStart));
1218 auto ModResult = CI.loadModule(FileStart, Path, Module::Hidden, false);
1219 PPCallbacks *CB = PP.getPPCallbacks();
1220 CB->moduleImport(SourceLocation(), Path, ModResult);
1221}
#define SM(sm)
Definition: Cuda.cpp:84
enum clang::sema::@1724::IndirectLocalPathEntry::EntryKind Kind
IndirectLocalPath & Path
This is the interface for scanning header and source files to get the minimum necessary preprocessor ...
Defines the clang::FileManager interface and associated types.
StringRef Filename
Definition: Format.cpp:3051
#define DUMP_BOOLEAN(Value, Text)
static StringRef ModuleKindName(Module::ModuleKind MK)
Defines the clang::Module class, which describes a module in the source code.
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.
const clang::PrintingPolicy & getPrintingPolicy() const
Definition: ASTContext.h:733
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
void ExecuteAction() override
Implement the ExecuteAction interface by running Sema on the already-initialized AST consumer.
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
Abstract interface for callback invocations by the ASTReader.
Definition: ASTReader.h:116
virtual bool ReadFullVersionInformation(StringRef FullVersion)
Receives the full Clang version information.
Definition: ASTReader.h:124
Reads an AST files chain containing the contents of a translation unit.
Definition: ASTReader.h:383
ModuleManager & getModuleManager()
Retrieve the module manager.
Definition: ASTReader.h:1890
@ ARR_ConfigurationMismatch
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
Definition: ASTReader.h:1745
unsigned getTotalNumSubmodules() const
Returns the number of submodules known.
Definition: ASTReader.h:1986
Module * getModule(unsigned ID) override
Retrieve the module that corresponds to the given module ID.
Definition: ASTReader.cpp:9448
static bool readASTFileControlBlock(StringRef Filename, FileManager &FileMgr, const InMemoryModuleCache &ModuleCache, const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions, ASTReaderListener &Listener, bool ValidateDiagnosticOptions, unsigned ClientLoadCapabilities=ARR_ConfigurationMismatch|ARR_OutOfDate)
Read the control block for the named AST file.
Definition: ASTReader.cpp:5544
Preprocessor & getPreprocessor() const
Retrieve the preprocessor.
Definition: ASTReader.h:1894
const LangOptions & getLangOpts() const
Definition: ASTUnit.h:464
IntrusiveRefCntPtr< ASTReader > getASTReader() const
Definition: ASTUnit.cpp:766
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
Abstract interface for a consumer of code-completion information.
CompilerInstance - Helper class for managing a single instance of the Clang compiler.
const PCHContainerReader & getPCHContainerReader() const
Return the appropriate PCHContainerReader depending on the current CodeGenOptions.
DiagnosticsEngine & getDiagnostics() const
Get the current diagnostics engine.
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...
ModuleLoadResult loadModule(SourceLocation ImportLoc, ModuleIdPath Path, Module::NameVisibilityKind Visibility, bool IsInclusionDirective) override
Attempt to load the given module.
FileManager & getFileManager() const
Return the current file manager to the caller.
PreprocessorOutputOptions & getPreprocessorOutputOpts()
InMemoryModuleCache & getModuleCache() const
Preprocessor & getPreprocessor() const
Return the current preprocessor.
ASTContext & getASTContext() const
FrontendOptions & getFrontendOpts()
HeaderSearchOptions & getHeaderSearchOpts()
bool hasCodeCompletionConsumer() const
const PCHContainerWriter & getPCHContainerWriter() const
Return the appropriate PCHContainerWriter depending on the current CodeGenOptions.
PreprocessorOptions & getPreprocessorOpts()
void createCodeCompletionConsumer()
Create a code completion consumer using the invocation; note that this will cause the source manager ...
DiagnosticOptions & getDiagnosticOpts()
LangOptions & getLangOpts()
SourceManager & getSourceManager() const
Return the current source manager.
CodeCompleteConsumer & getCodeCompletionConsumer() const
void createSema(TranslationUnitKind TUKind, CodeCompleteConsumer *CompletionConsumer)
Create the Sema object to be used for parsing.
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
static Decl * castFromDeclContext(const DeclContext *)
Definition: DeclBase.cpp:1038
SourceLocation getLocation() const
Definition: DeclBase.h:442
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
Definition: Diagnostic.h:1493
bool hasErrorOccurred() const
Definition: Diagnostic.h:866
void setSuppressAllDiagnostics(bool Val)
Suppress all diagnostics, to silence the front end when we know that we don't want any more diagnosti...
Definition: Diagnostic.h:720
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
void ExecuteAction() override
Implement the ExecuteAction interface by running Sema on the already-initialized AST consumer.
bool BeginInvocation(CompilerInstance &CI) override
Callback before starting processing a single input, giving the opportunity to modify the CompilerInvo...
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(FileEntryRef Entry, bool isVolatile=false, bool RequiresNullTerminator=true, std::optional< int64_t > MaybeLimit=std::nullopt, bool IsText=true)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
Abstract base class for actions which can be performed by the frontend.
const FrontendInputFile & getCurrentInput() const
InputKind getCurrentFileKind() const
virtual bool shouldEraseOutputFiles()
Callback at the end of processing a single input, to determine if the output files should be erased o...
ASTUnit & getCurrentASTUnit() const
CompilerInstance & getCompilerInstance() const
Module * getCurrentModule() const
StringRef getCurrentFile() const
virtual bool BeginSourceFileAction(CompilerInstance &CI)
Callback at the start of processing a single input.
virtual TranslationUnitKind getTranslationUnitKind()
For AST-based actions, the kind of translation unit we're handling.
virtual bool hasCodeCompletionSupport() const
Does this action support use with code completion?
StringRef getCurrentFileOrBufferName() const
bool isCurrentFileAST() 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 IncludeTimestamps
Whether timestamps should be written to the produced PCH file.
std::string ASTDumpFilter
If given, filter dumped AST Decl nodes by this substring.
unsigned ASTDumpLookups
Whether we include lookup table dumps in AST dumps.
ASTDumpOutputFormat ASTDumpFormat
Specifies the output format of the AST.
std::string OutputFile
The output file, if any.
unsigned GenReducedBMI
Whether to generate reduced BMI for C++20 named modules.
std::vector< std::shared_ptr< ModuleFileExtension > > ModuleFileExtensions
The list of module file extensions.
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,...
std::string ModuleOutputPath
Output Path for module output file.
unsigned ASTDumpDeclTypes
Whether we include declaration type dumps in AST dumps.
unsigned ASTDumpAll
Whether we deserialize all decls when forming AST dumps.
unsigned RelocatablePCH
When generating PCH files, instruct the AST writer to create relocatable PCH files.
unsigned ASTDumpDecls
Whether we include declaration dumps in AST dumps.
bool shouldEraseOutputFiles() override
Callback at the end of processing a single input, to determine if the output files should be erased o...
std::vector< std::unique_ptr< ASTConsumer > > CreateMultiplexConsumer(CompilerInstance &CI, StringRef InFile)
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
bool BeginSourceFileAction(CompilerInstance &CI) override
Callback at the start of processing a single input.
std::unique_ptr< raw_pwrite_stream > CreateOutputFile(CompilerInstance &CI, StringRef InFile) override
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
static std::unique_ptr< llvm::raw_pwrite_stream > CreateOutputFile(CompilerInstance &CI, StringRef InFile, std::string &OutputFile)
Creates file to write the PCH into and returns a stream to write it into.
bool BeginSourceFileAction(CompilerInstance &CI) override
Callback at the start of processing a single input.
static bool ComputeASTConsumerArguments(CompilerInstance &CI, std::string &Sysroot)
Compute the AST consumer arguments that will be used to create the PCHGenerator instance returned by ...
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
bool shouldEraseOutputFiles() override
Callback at the end of processing a single input, to determine if the output files should be erased o...
HeaderSearchOptions - Helper class for storing options related to the initialization of the HeaderSea...
std::vector< SystemHeaderPrefix > SystemHeaderPrefixes
User-specified system header prefixes.
std::string ModuleFormat
The module/pch container format.
std::string Sysroot
If non-empty, the directory to use as a "virtual system root" for include paths.
std::vector< std::string > VFSOverlayFiles
The set of user-provided virtual filesystem overlay files.
unsigned UseLibcxx
Use libc++ instead of the default libstdc++.
unsigned UseBuiltinIncludes
Include the compiler builtin includes.
unsigned UseStandardCXXIncludes
Include the system standard C++ library include search directories.
std::vector< Entry > UserEntries
User specified include entries.
std::string ResourceDir
The directory which holds the compiler resource files (builtin includes, etc.).
unsigned UseStandardSystemIncludes
Include the system standard include search directories.
Encapsulates the information needed to find the file referenced by a #include or #include_next,...
Definition: HeaderSearch.h:237
std::string getCachedModuleFileName(Module *Module)
Retrieve the name of the cached module file that should be used to load the given module.
One of these records is kept for each identifier that is lexed.
@ CMK_HeaderUnit
Compiling a module header unit.
Definition: LangOptions.h:107
@ CMK_ModuleInterface
Compiling a C++ modules interface unit.
Definition: LangOptions.h:110
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:499
std::string CurrentModule
The name of the current module, of which the main source file is a part.
Definition: LangOptions.h:554
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
Definition: LangOptions.h:560
Lexer - This provides a simple interface that turns a text buffer into a stream of tokens.
Definition: Lexer.h:78
void SetKeepWhitespaceMode(bool Val)
SetKeepWhitespaceMode - This method lets clients enable or disable whitespace retention mode.
Definition: Lexer.h:254
bool LexFromRawLexer(Token &Result)
LexFromRawLexer - Lex a token from a designated raw lexer (one with no associated preprocessor object...
Definition: Lexer.h:236
static PreambleBounds ComputePreamble(StringRef Buffer, const LangOptions &LangOpts, unsigned MaxLines=0)
Compute the preamble of the given file.
Definition: Lexer.cpp:636
Describes a module or submodule.
Definition: Module.h:115
SmallVector< ExportDecl, 2 > Exports
The set of export declarations.
Definition: Module.h:442
@ Hidden
All of the names in this module are hidden.
Definition: Module.h:416
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:465
ModuleKind Kind
The kind of this module.
Definition: Module.h:160
llvm::SmallSetVector< Module *, 2 > Imports
The set of modules imported by this module, and on which this module depends.
Definition: Module.h:429
std::string Name
The name of this module.
Definition: Module.h:118
llvm::iterator_range< submodule_iterator > submodules()
Definition: Module.h:809
@ ModuleImplementationUnit
This is a C++20 module implementation unit.
Definition: Module.h:138
@ ModuleMapModule
This is a module that was defined by a module map and built out of header files.
Definition: Module.h:129
@ ImplicitGlobalModuleFragment
This is an implicit fragment of the global module which contains only language linkage declarations (...
Definition: Module.h:156
@ ModulePartitionInterface
This is a C++20 module partition interface.
Definition: Module.h:141
@ ModuleInterfaceUnit
This is a C++20 module interface unit.
Definition: Module.h:135
@ ModuleHeaderUnit
This is a C++20 header unit.
Definition: Module.h:132
@ ModulePartitionImplementation
This is a C++20 module partition implementation.
Definition: Module.h:144
@ PrivateModuleFragment
This is the private module fragment within some C++ module.
Definition: Module.h:151
@ ExplicitGlobalModuleFragment
This is the explicit Global Module Fragment of a modular TU.
Definition: Module.h:148
This represents a decl that may have a name.
Definition: Decl.h:253
virtual void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const
Appends a human-readable name for this declaration into the given stream.
Definition: Decl.cpp:1818
virtual std::unique_ptr< ASTConsumer > CreatePCHContainerGenerator(CompilerInstance &CI, const std::string &MainFileName, const std::string &OutputFileName, std::unique_ptr< llvm::raw_pwrite_stream > OS, std::shared_ptr< PCHBuffer > Buffer) const =0
Return an ASTConsumer that can be chained with a PCHGenerator that produces a wrapper file format con...
This interface provides a way to observe the actions of the preprocessor as it does its thing.
Definition: PPCallbacks.h:36
virtual void moduleImport(SourceLocation ImportLoc, ModuleIdPath Path, const Module *Imported)
Callback invoked whenever there was an explicit module-import syntax.
Definition: PPCallbacks.h:209
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::pair< unsigned, bool > PrecompiledPreambleBytes
If non-zero, the implicit PCH include is actually a precompiled preamble that covers this number of b...
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
std::vector< std::pair< std::string, bool > > Macros
bool AllowPCHWithCompilerErrors
When true, a PCH with compiler errors will not be rejected.
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Definition: Preprocessor.h:138
void DumpToken(const Token &Tok, bool DumpFlags=false) const
Print the token to stderr, used for debugging.
void IgnorePragmas()
Install empty handlers for all pragmas (making them ignored).
Definition: Pragma.cpp:2193
PPCallbacks * getPPCallbacks() const
void Lex(Token &Result)
Lex the next token for this preprocessor.
void EnterMainSourceFile()
Enter the specified FileID as the main source file, which implicitly adds the builtin defines etc.
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
SourceManager & getSourceManager() const
llvm::iterator_range< macro_iterator > macros(bool IncludeExternalMacros=true) const
HeaderSearch & getHeaderSearchInfo() const
const LangOptions & getLangOpts() const
Represents an unpacked "presumed" location which can be presented to the user.
unsigned getColumn() const
Return the presumed column number of this location.
const char * getFilename() const
Return the presumed filename of this location.
unsigned getLine() const
Return the presumed line number of this location.
bool isInvalid() const
Return true if this object is invalid or uninitialized.
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
Sema - This implements semantic analysis and AST building for C.
Definition: Sema.h:464
ASTContext & Context
Definition: Sema.h:909
const LangOptions & getLangOpts() const
Definition: Sema.h:525
std::vector< std::unique_ptr< TemplateInstantiationCallback > > TemplateInstCallbacks
The template instantiation callbacks to trace or track instantiations (objects can be chained).
Definition: Sema.h:13198
SourceManager & getSourceManager() const
Definition: Sema.h:530
Encodes a location in the source.
void print(raw_ostream &OS, const SourceManager &SM) const
This class handles loading and caching of source files into memory.
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
Options for controlling the target.
Definition: TargetOptions.h:26
std::string Triple
The name of the target triple to compile for.
Definition: TargetOptions.h:29
std::string ABI
If given, the name of the target ABI to use.
Definition: TargetOptions.h:45
std::string TuneCPU
If given, the name of the target CPU to tune code for.
Definition: TargetOptions.h:39
std::string CPU
If given, the name of the target CPU to generate code for.
Definition: TargetOptions.h:36
std::vector< std::string > FeaturesAsWritten
The list of target specific features to enable or disable, as written on the command line.
Definition: TargetOptions.h:54
This is a base class for callbacks that will be notified at every template instantiation.
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
void ExecuteAction() override
Implement the ExecuteAction interface by running Sema on the already-initialized AST consumer.
Token - This structure provides full information about a lexed token.
Definition: Token.h:36
bool isNot(tok::TokenKind K) const
Definition: Token.h:100
The base class of the type hierarchy.
Definition: Type.h:1828
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
void ExecuteAction() override
Implement the ExecuteAction interface by running Sema on the already-initialized AST consumer.
Information about a module that has been loaded by the ASTReader.
Definition: ModuleFile.h:130
std::string ModuleName
The name of the module.
Definition: ModuleFile.h:148
ModuleFile & getPrimaryModule()
Returns the primary module associated with the manager, that is, the first module loaded.
Defines the clang::TargetInfo interface.
@ 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
The JSON file list parser is used to communicate input to InstallAPI.
void atTemplateEnd(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema, const Sema::CodeSynthesisContext &Inst)
void atTemplateBegin(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema, const Sema::CodeSynthesisContext &Inst)
void printDependencyDirectivesAsSource(StringRef Source, ArrayRef< dependency_directives_scan::Directive > Directives, llvm::raw_ostream &OS)
Print the previously scanned dependency directives as minimized source text.
void initialize(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema)
bool scanSourceForDependencyDirectives(StringRef Input, SmallVectorImpl< dependency_directives_scan::Token > &Tokens, SmallVectorImpl< dependency_directives_scan::Directive > &Directives, DiagnosticsEngine *Diags=nullptr, SourceLocation InputSourceLoc=SourceLocation())
Scan the input for the preprocessor directives that might have an effect on the dependencies for a co...
std::unique_ptr< ASTConsumer > CreateASTDeclNodeLister()
@ C
Languages that the frontend can parse and compile.
@ CIR
LLVM IR & CIR: we accept these so that we can run the optimizer on them, and compile them to assembly...
@ Asm
Assembly: we accept this only so that we can preprocess it.
void DoPrintPreprocessedInput(Preprocessor &PP, raw_ostream *OS, const PreprocessorOutputOptions &Opts)
DoPrintPreprocessedInput - Implement -E mode.
std::unique_ptr< ASTConsumer > CreateASTDumper(std::unique_ptr< raw_ostream > OS, StringRef FilterString, bool DumpDecls, bool Deserialize, bool DumpLookups, bool DumpDeclTypes, ASTDumpOutputFormat Format)
std::unique_ptr< ASTConsumer > CreateASTPrinter(std::unique_ptr< raw_ostream > OS, StringRef FilterString)
std::unique_ptr< ASTConsumer > CreateASTViewer()
@ None
Perform validation, don't disable it.
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
Definition: Version.cpp:68
void finalize(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema)
Diagnostic wrappers for TextAPI types for error reporting.
Definition: Dominators.h:30
Metadata for a module file extension.
unsigned MajorVersion
The major version of the extension data.
std::string UserInfo
A string containing additional user information that will be stored with the metadata.
std::string BlockName
The name used to identify this particular extension block within the resulting module file.
unsigned MinorVersion
The minor version of the extension data.
unsigned Size
Size of the preamble in bytes.
Definition: Lexer.h:62
Describes how types, statements, expressions, and declarations should be printed.
Definition: PrettyPrinter.h:57
unsigned SuppressDefaultTemplateArgs
When true, attempt to suppress template arguments that match the default argument for the parameter.
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
Definition: Sema.h:12660
static void mapping(IO &io, TemplightEntry &fields)