29#include "llvm/Config/llvm-config.h"
30#include "llvm/Support/ErrorHandling.h"
31#include "llvm/Support/FileSystem.h"
32#include "llvm/Support/MemoryBuffer.h"
33#include "llvm/Support/YAMLTraits.h"
34#include "llvm/Support/raw_ostream.h"
37#include <system_error>
45std::unique_ptr<ASTConsumer>
47 return std::make_unique<ASTConsumer>();
68std::unique_ptr<ASTConsumer>
71 return std::make_unique<ASTConsumer>();
78std::unique_ptr<ASTConsumer>
80 if (std::unique_ptr<raw_ostream> OS =
86std::unique_ptr<ASTConsumer>
95std::unique_ptr<ASTConsumer>
100std::unique_ptr<ASTConsumer>
105std::unique_ptr<ASTConsumer>
111 std::string OutputFile;
112 std::unique_ptr<raw_pwrite_stream> OS =
121 auto Buffer = std::make_shared<PCHBuffer>();
122 std::vector<std::unique_ptr<ASTConsumer>> Consumers;
123 Consumers.push_back(std::make_unique<PCHGenerator>(
127 FrontendOpts.IncludeTimestamps, FrontendOpts.BuildingImplicitModule));
129 CI, std::string(InFile), OutputFile, std::move(OS), Buffer));
131 return std::make_unique<MultiplexConsumer>(std::move(Consumers));
135 std::string &Sysroot) {
145std::unique_ptr<llvm::raw_pwrite_stream>
147 std::string &OutputFile,
151 true, InFile,
"",
false,
172std::vector<std::unique_ptr<ASTConsumer>>
176 OS = CreateOutputFile(CI, InFile);
183 auto Buffer = std::make_shared<PCHBuffer>();
184 std::vector<std::unique_ptr<ASTConsumer>> Consumers;
186 Consumers.push_back(std::make_unique<PCHGenerator>(
196 CI, std::string(InFile), OutputFile, std::move(OS), Buffer));
200std::unique_ptr<ASTConsumer>
203 std::vector<std::unique_ptr<ASTConsumer>> Consumers =
205 if (Consumers.empty())
208 return std::make_unique<MultiplexConsumer>(std::move(Consumers));
216bool GenerateModuleFromModuleMapAction::BeginSourceFileAction(
226std::unique_ptr<raw_pwrite_stream>
233 if (ModuleMapFile.empty())
234 ModuleMapFile = InFile;
253 if (
const auto InputFormat = FIF.getKind().getFormat();
256 diag::err_frontend_action_unsupported_input_format)
257 <<
"module interface compilation" << FIF.getFile() << InputFormat;
271std::unique_ptr<ASTConsumer>
274 std::vector<std::unique_ptr<ASTConsumer>> Consumers;
278 Consumers.push_back(std::make_unique<ReducedBMIGenerator>(
284 Consumers.push_back(std::make_unique<CXX20ModulesGenerator>(
289 return std::make_unique<MultiplexConsumer>(std::move(Consumers));
292std::unique_ptr<raw_pwrite_stream>
298std::unique_ptr<ASTConsumer>
299GenerateReducedModuleInterfaceAction::CreateASTConsumer(
CompilerInstance &CI,
301 return std::make_unique<ReducedBMIGenerator>(
315std::unique_ptr<raw_pwrite_stream>
324std::unique_ptr<ASTConsumer>
326 return std::make_unique<ASTConsumer>();
329std::unique_ptr<ASTConsumer>
332 return std::make_unique<ASTConsumer>();
335std::unique_ptr<ASTConsumer>
337 return std::make_unique<ASTConsumer>();
344 std::unique_ptr<ASTReader> Reader(
new ASTReader(
348 Sysroot.empty() ?
"" : Sysroot.c_str(),
363 llvm::raw_ostream &Out;
370#define DUMP_BOOLEAN(Value, Text) \
371 Out.indent(4) << Text << ": " << (Value? "Yes" : "No") << "\n"
373 bool ReadFullVersionInformation(StringRef FullVersion)
override {
378 <<
" Clang: " << FullVersion <<
"\n";
382 void ReadModuleName(StringRef ModuleName)
override {
383 Out.indent(2) <<
"Module name: " << ModuleName <<
"\n";
385 void ReadModuleMapFile(StringRef ModuleMapPath)
override {
386 Out.indent(2) <<
"Module map file: " << ModuleMapPath <<
"\n";
389 bool ReadLanguageOptions(
const LangOptions &LangOpts,
390 StringRef ModuleFilename,
bool Complain,
391 bool AllowCompatibleDifferences)
override {
393 using CK = LangOptions::CompatibilityKind;
395 Out.indent(2) <<
"Language options:\n";
396#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
397 if constexpr (CK::Compatibility != CK::Benign) \
398 DUMP_BOOLEAN(LangOpts.Name, Description);
399#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
400 if constexpr (CK::Compatibility != CK::Benign) \
401 Out.indent(4) << Description << ": " \
402 << static_cast<unsigned>(LangOpts.get##Name()) << "\n";
403#define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description) \
404 if constexpr (CK::Compatibility != CK::Benign) \
405 Out.indent(4) << Description << ": " << LangOpts.Name << "\n";
406#include "clang/Basic/LangOptions.def"
409 Out.indent(4) <<
"Module features:\n";
417 bool ReadTargetOptions(
const TargetOptions &TargetOpts,
418 StringRef ModuleFilename,
bool Complain,
419 bool AllowCompatibleDifferences)
override {
420 Out.indent(2) <<
"Target options:\n";
421 Out.indent(4) <<
" Triple: " << TargetOpts.
Triple <<
"\n";
422 Out.indent(4) <<
" CPU: " << TargetOpts.
CPU <<
"\n";
423 Out.indent(4) <<
" TuneCPU: " << TargetOpts.
TuneCPU <<
"\n";
424 Out.indent(4) <<
" ABI: " << TargetOpts.
ABI <<
"\n";
427 Out.indent(4) <<
"Target features:\n";
437 bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts,
438 StringRef ModuleFilename,
439 bool Complain)
override {
440 Out.indent(2) <<
"Diagnostic options:\n";
441#define DIAGOPT(Name, Bits, Default) DUMP_BOOLEAN(DiagOpts.Name, #Name);
442#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
443 Out.indent(4) << #Name << ": " \
444 << static_cast<unsigned>(DiagOpts.get##Name()) << "\n";
445#define VALUE_DIAGOPT(Name, Bits, Default) \
446 Out.indent(4) << #Name << ": " << DiagOpts.Name << "\n";
447#include "clang/Basic/DiagnosticOptions.def"
449 Out.indent(4) <<
"Diagnostic flags:\n";
458 bool ReadHeaderSearchOptions(
const HeaderSearchOptions &HSOpts,
459 StringRef ModuleFilename,
460 StringRef ContextHash,
461 bool Complain)
override {
464 std::string(ContextHash));
466 Out.indent(2) <<
"Header search options:\n";
467 Out.indent(4) <<
"System root [-isysroot=]: '" << HSOpts.
Sysroot <<
"'\n";
468 Out.indent(4) <<
"Resource dir [ -resource-dir=]: '" << HSOpts.
ResourceDir <<
"'\n";
469 Out.indent(4) <<
"Module Cache: '" << SpecificModuleCachePath <<
"'\n";
471 "Use builtin include directories [-nobuiltininc]");
473 "Use standard system include directories [-nostdinc]");
475 "Use standard C++ include directories [-nostdinc++]");
477 "Use libc++ (rather than libstdc++) [-stdlib=]");
481 bool ReadHeaderSearchPaths(
const HeaderSearchOptions &HSOpts,
482 bool Complain)
override {
483 Out.indent(2) <<
"Header search paths:\n";
484 Out.indent(4) <<
"User entries:\n";
486 Out.indent(6) << Entry.Path <<
"\n";
487 Out.indent(4) <<
"System header prefixes:\n";
489 Out.indent(6) << Prefix.Prefix <<
"\n";
490 Out.indent(4) <<
"VFS overlay files:\n";
492 Out.indent(6) << Overlay <<
"\n";
496 bool ReadPreprocessorOptions(
const PreprocessorOptions &PPOpts,
497 StringRef ModuleFilename,
bool ReadMacros,
499 std::string &SuggestedPredefines)
override {
500 Out.indent(2) <<
"Preprocessor options:\n";
502 "Uses compiler/target-specific predefines [-undef]");
504 "Uses detailed preprocessing record (for indexing)");
507 Out.indent(4) <<
"Predefined macros:\n";
510 for (std::vector<std::pair<std::string, bool/*isUndef*/> >::const_iterator
518 Out << I->first <<
"\n";
524 void readModuleFileExtension(
525 const ModuleFileExtensionMetadata &Metadata)
override {
526 Out.indent(2) <<
"Module file extension '"
539 bool needsInputFileVisitation()
override {
return true; }
543 bool needsSystemInputFileVisitation()
override {
return true; }
548 bool visitInputFileAsRequested(StringRef FilenameAsRequested,
549 StringRef Filename,
bool isSystem,
550 bool isOverridden, time_t StoredTime,
551 bool isExplicitModule)
override {
553 Out.indent(2) <<
"Input file: " << FilenameAsRequested;
555 if (isSystem || isOverridden || isExplicitModule) {
559 if (isOverridden || isExplicitModule)
564 if (isExplicitModule)
567 if (isExplicitModule)
568 Out <<
"ExplicitModule";
576 Out.indent(4) <<
"MTime: " << llvm::itostr(StoredTime) <<
"\n";
583 bool needsImportVisitation()
const override {
return true; }
587 void visitImport(StringRef ModuleName, StringRef Filename)
override {
588 Out.indent(2) <<
"Imports module '" << ModuleName
589 <<
"': " << Filename.str() <<
"\n";
605 return "Module Map Module";
607 return "Interface Unit";
609 return "Implementation Unit";
611 return "Partition Interface";
613 return "Partition Implementation";
615 return "Header Unit";
617 return "Global Module Fragment";
619 return "Implicit Module Fragment";
621 return "Private Module Fragment";
623 llvm_unreachable(
"unknown module kind!");
638 if (!OutputFileName.empty() && OutputFileName !=
"-") {
640 OutputStream.reset(
new llvm::raw_fd_ostream(
641 OutputFileName.str(), EC, llvm::sys::fs::OF_TextWithCRLF));
643 llvm::raw_ostream &Out = OutputStream ? *OutputStream : llvm::outs();
645 Out <<
"Information for module file '" <<
getCurrentFile() <<
"':\n";
648 StringRef Magic = (*Buffer)->getMemBufferRef().getBuffer();
649 bool IsRaw = Magic.starts_with(
"CPCH");
650 Out <<
" Module format: " << (IsRaw ?
"raw" :
"obj") <<
"\n";
655 PP.getHeaderSearchInfo().getHeaderSearchOpts();
664 unsigned SubModuleCount = R->getTotalNumSubmodules();
666 Out <<
" ====== C++20 Module structure ======\n";
669 Out <<
" Mismatched module names : " << MF.
ModuleName <<
" and "
679 std::map<std::string, SubModInfo> SubModMap;
682 auto I = SubModMap.find(Name);
683 if (I == SubModMap.end())
684 Out <<
" was not found in the sub modules!\n";
686 I->second.Seen =
true;
687 Out <<
" is at index #" << I->second.Idx <<
"\n";
690 Module *Primary =
nullptr;
691 for (
unsigned Idx = 0; Idx <= SubModuleCount; ++Idx) {
692 Module *M = R->getModule(Idx);
698 <<
"' is the Primary Module at index #" << Idx <<
"\n";
699 SubModMap.insert({M->
Name, {Idx, M, M->
Kind, M->Name,
true}});
701 SubModMap.insert({M->
Name, {Idx, M, M->
Kind, M->Name,
false}});
705 Out <<
" Sub Modules:\n";
707 PrintSubMapEntry(MI->Name, MI->Kind);
710 Out <<
" Imports:\n";
712 PrintSubMapEntry(IMP->
Name, IMP->
Kind);
715 Out <<
" Exports:\n";
716 for (
unsigned MN = 0, N = Primary->
Exports.size(); MN != N; ++MN) {
718 PrintSubMapEntry(M->Name, M->Kind);
727 std::vector<StringRef> MacroNames;
728 for (
const auto &M : R->getPreprocessor().macros()) {
729 if (M.first->isFromAST())
730 MacroNames.push_back(M.first->getName());
732 llvm::sort(MacroNames);
733 if (!MacroNames.empty())
734 Out <<
" Macro Definitions:\n";
735 for (StringRef Name : MacroNames)
736 Out <<
" " << Name <<
"\n";
740 for (
const auto &
SM : SubModMap) {
741 if (!
SM.second.Seen &&
SM.second.Mod) {
743 <<
"' at index #" <<
SM.second.Idx
744 <<
" has no direct reference in the Primary\n";
747 Out <<
" ====== ======\n";
768 llvm::MemoryBufferRef FromFile =
SM.getBufferOrFake(
SM.getMainFileID());
774 while (RawTok.
isNot(tok::eof)) {
776 llvm::errs() <<
"\n";
789 llvm::errs() <<
"\n";
790 }
while (
Tok.isNot(tok::eof));
804 }
while (
Tok.isNot(tok::eof));
823 bool BinaryMode =
false;
824 if (llvm::Triple(LLVM_HOST_TRIPLE).isOSWindows()) {
827 if (std::optional<llvm::MemoryBufferRef> Buffer =
828 SM.getBufferOrNone(
SM.getMainFileID())) {
829 const char *cur = Buffer->getBufferStart();
830 const char *end = Buffer->getBufferEnd();
831 const char *next = (cur != end) ? cur + 1 : end;
845 }
else if (*cur == 0x0A)
854 std::unique_ptr<raw_ostream> OS =
862 if (Input.isFile()) {
864 OS->write_escaped(Input.getFile());
868 (*OS) <<
"#pragma clang module contents\n";
905 llvm::outs().write((*Buffer)->getBufferStart(),
Preamble);
910 StringRef CompilerOptionNames,
912 bool FirstValue =
true;
913 for (
bool CompilerOptionValue : CompilerOptionValues) {
914 auto [CompilerOptionName, RemainingCompilerOptionNames] =
915 CompilerOptionNames.split(
'\0');
916 CompilerOptionNames = RemainingCompilerOptionNames;
920 OS <<
"\t{\"" << CompilerOptionName
921 <<
"\" : " << (CompilerOptionValue ?
"true" :
"false") <<
"}";
923 assert(CompilerOptionNames.empty() &&
"compiler option name count mismatch");
928 std::unique_ptr<raw_ostream> OSP =
933 raw_ostream &
OS = *OSP;
943 OS <<
"\n\"features\" : [\n";
945 static constexpr char FeatureNames[] = {
946#define FEATURE(Name, Predicate) #Name "\0"
947#include "clang/Basic/Features.def"
949 const bool FeatureValues[] = {
950#define FEATURE(Name, Predicate) static_cast<bool>(Predicate),
951#include "clang/Basic/Features.def"
954 OS, StringRef(FeatureNames,
sizeof(FeatureNames) - 1), FeatureValues);
958 OS <<
"\n\"extensions\" : [\n";
960 static constexpr char ExtensionNames[] = {
961#define EXTENSION(Name, Predicate) #Name "\0"
962#include "clang/Basic/Features.def"
964 const bool ExtensionValues[] = {
965#define EXTENSION(Name, Predicate) static_cast<bool>(Predicate),
966#include "clang/Basic/Features.def"
969 OS, StringRef(ExtensionNames,
sizeof(ExtensionNames) - 1),
980 llvm::MemoryBufferRef FromFile =
SM.getBufferOrFake(
SM.getMainFileID());
986 SM.getLocForStartOfFile(
SM.getMainFileID()))) {
988 "no errors reported for failure");
1000 }
while (
Tok.isNot(tok::eof));
1015 StringRef RootSigName;
1016 llvm::dxbc::RootSignatureVersion Version;
1018 std::optional<StringLiteral *> processStringLiteral(
ArrayRef<Token> Tokens) {
1021 return std::nullopt;
1023 ExprResult StringResult = Actions.ActOnUnevaluatedStringLiteral(Tokens);
1025 return std::nullopt;
1027 if (
auto Signature = dyn_cast<StringLiteral>(StringResult.
get()))
1030 return std::nullopt;
1040 auto Signature = processStringLiteral(MI->
tokens());
1041 if (!Signature.has_value()) {
1043 diag::err_expected_string_literal)
1044 << 4 <<
"RootSignature";
1050 Actions.HLSL().SetRootSignatureOverride(DeclIdent);
1054 llvm::dxbc::RootSignatureVersion Version)
1055 :
PPCallbacks(), Actions(Actions), RootSigName(RootSigName),
1075 bool IsRootSignatureTarget =
1081 StringRef RootSigName =
1084 auto MacroCallback = std::make_unique<InjectRootSignatureCallback>(
1091 if (IsRootSignatureTarget)
This is the interface for scanning header and source files to get the minimum necessary preprocessor ...
Defines the clang::FileManager interface and associated types.
static void writeCompilerOptionValues(raw_ostream &OS, StringRef CompilerOptionNames, ArrayRef< bool > CompilerOptionValues)
#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.
void MacroDefined(const Token &MacroNameTok, const MacroDirective *MD) override
Hook called whenever a macro definition is seen.
InjectRootSignatureCallback(Sema &Actions, StringRef RootSigName, llvm::dxbc::RootSignatureVersion Version)
const TargetInfo & getTargetInfo() const
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.
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.
virtual bool ReadFullVersionInformation(StringRef FullVersion)
Receives the full Clang version information.
Reads an AST files chain containing the contents of a translation unit.
@ ARR_ConfigurationMismatch
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
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.
const LangOptions & getLangOpts() const
IntrusiveRefCntPtr< ASTReader > getASTReader() const
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
CompilerInstance - Helper class for managing a single instance of the Clang compiler.
std::unique_ptr< raw_pwrite_stream > createDefaultOutputFile(bool Binary=true, StringRef BaseInput="", StringRef Extension="", bool RemoveFileOnSignal=true, bool CreateMissingDirectories=false, bool ForceUseTemporary=false, bool SetOnlyIfDifferent=false)
Create the default output file (from the invocation's options) and add it to the list of tracked outp...
const PCHContainerReader & getPCHContainerReader() const
Return the appropriate PCHContainerReader depending on the current CodeGenOptions.
DiagnosticsEngine & getDiagnostics() const
Get the current diagnostics engine.
FileManager & getFileManager() const
Return the current file manager to the caller.
PreprocessorOutputOptions & getPreprocessorOutputOpts()
ModuleCache & getModuleCache() const
bool hasASTContext() const
Preprocessor & getPreprocessor() const
Return the current preprocessor.
ASTContext & getASTContext() const
FrontendOptions & getFrontendOpts()
HeaderSearchOptions & getHeaderSearchOpts()
const PCHContainerWriter & getPCHContainerWriter() const
Return the appropriate PCHContainerWriter depending on the current CodeGenOptions.
PreprocessorOptions & getPreprocessorOpts()
DiagnosticOptions & getDiagnosticOpts()
LangOptions & getLangOpts()
CodeGenOptions & getCodeGenOpts()
SourceManager & getSourceManager() const
Return the current source manager.
bool hasPreprocessor() const
void createSema(TranslationUnitKind TUKind, CodeCompleteConsumer *CompletionConsumer)
Create the Sema object to be used for parsing.
std::vector< std::string > Remarks
The list of -R... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > Warnings
The list of -W... options used to alter the diagnostic mappings, with the prefixes removed.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
bool hasErrorOccurred() const
void setSuppressAllDiagnostics(bool Val)
Suppress all diagnostics, to silence the front end when we know that we don't want any more diagnosti...
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.
Implements support for file system lookup, file system caching, and directory search management.
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,...
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
virtual bool PrepareToExecuteAction(CompilerInstance &CI)
Prepare to execute the action on the given CompilerInstance.
Module * getCurrentModule() const
StringRef getCurrentFile() const
virtual bool BeginSourceFileAction(CompilerInstance &CI)
Callback at the start of processing a single input.
virtual void ExecuteAction()=0
Callback to run the program action, using the initialized compiler instance.
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.
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.
SmallVector< FrontendInputFile, 0 > Inputs
The input files and their types.
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.
bool PrepareToExecuteAction(CompilerInstance &CI) override
Prepare to execute the action on the given CompilerInstance.
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.
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.
static std::unique_ptr< llvm::raw_pwrite_stream > CreateOutputFile(CompilerInstance &CI, StringRef InFile, std::string &OutputFile, bool SetOnlyIfDifferent=false)
Creates file to write the PCH into and returns a stream to write it into.
bool shouldEraseOutputFiles() override
Callback at the end of processing a single input, to determine if the output files should be erased o...
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
HLSLFrontendAction(std::unique_ptr< FrontendAction > WrappedAction)
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
@ CMK_HeaderUnit
Compiling a module header unit.
@ CMK_ModuleInterface
Compiling a C++ modules interface unit.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
std::string HLSLRootSigOverride
The HLSL root signature that will be used to overide the root signature used for the shader entry poi...
llvm::dxbc::RootSignatureVersion HLSLRootSigVer
The HLSL root signature version for dxil.
std::string CurrentModule
The name of the current module, of which the main source file is a part.
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
Lexer - This provides a simple interface that turns a text buffer into a stream of tokens.
void SetKeepWhitespaceMode(bool Val)
SetKeepWhitespaceMode - This method lets clients enable or disable whitespace retention mode.
bool LexFromRawLexer(Token &Result)
LexFromRawLexer - Lex a token from a designated raw lexer (one with no associated preprocessor object...
static PreambleBounds ComputePreamble(StringRef Buffer, const LangOptions &LangOpts, unsigned MaxLines=0)
Compute the preamble of the given file.
Encapsulates changes to the "macros namespace" (the location where the macro name became active,...
const MacroInfo * getMacroInfo() const
Encapsulates the data about a macro definition (e.g.
SourceLocation getDefinitionLoc() const
Return the location that the macro was defined at.
ArrayRef< Token > tokens() const
static ModuleFileName makeExplicit(std::string Name)
Creates a file name for an explicit module.
Describes a module or submodule.
SmallVector< ExportDecl, 2 > Exports
The set of export declarations.
void print(raw_ostream &OS, unsigned Indent=0, bool Dump=false) const
Print the module map for this module to the given stream.
ModuleKind Kind
The kind of this module.
std::string Name
The name of this module.
llvm::iterator_range< submodule_iterator > submodules()
@ ModuleImplementationUnit
This is a C++20 module implementation unit.
@ ModuleMapModule
This is a module that was defined by a module map and built out of header files.
@ ImplicitGlobalModuleFragment
This is an implicit fragment of the global module which contains only language linkage declarations (...
@ ModulePartitionInterface
This is a C++20 module partition interface.
@ ModuleInterfaceUnit
This is a C++20 module interface unit.
@ ModuleHeaderUnit
This is a C++20 header unit.
@ ModulePartitionImplementation
This is a C++20 module partition implementation.
@ PrivateModuleFragment
This is the private module fragment within some C++ module.
@ ExplicitGlobalModuleFragment
This is the explicit Global Module Fragment of a modular TU.
llvm::SmallVector< ModuleRef, 2 > Imports
The set of modules imported by this module, and on which this module depends.
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.
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
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.
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).
void Lex(Token &Result)
Lex the next token for this preprocessor.
void addPPCallbacks(std::unique_ptr< PPCallbacks > C)
void EnterMainSourceFile()
Enter the specified FileID as the main source file, which implicitly adds the builtin defines etc.
SourceManager & getSourceManager() const
HeaderSearch & getHeaderSearchInfo() const
const LangOptions & getLangOpts() const
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.
Encodes a location in the source.
This class handles loading and caching of source files into memory.
~SyntaxOnlyAction() override
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
Exposes information about the current target.
TargetOptions & getTargetOpts() const
Retrieve the target options.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
std::string Triple
The name of the target triple to compile for.
std::string ABI
If given, the name of the target ABI to use.
std::string TuneCPU
If given, the name of the target CPU to tune code for.
std::string CPU
If given, the name of the target CPU to generate code for.
std::vector< std::string > FeaturesAsWritten
The list of target specific features to enable or disable, as written on the command line.
std::string HLSLEntry
The entry point name for HLSL shader being compiled as specified by -E.
Token - This structure provides full information about a lexed token.
IdentifierInfo * getIdentifierInfo() const
bool isNot(tok::TokenKind K) const
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.
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
WrapperFrontendAction(std::unique_ptr< FrontendAction > WrappedAction)
Construct a WrapperFrontendAction from an existing action, taking ownership of it.
TranslationUnitKind getTranslationUnitKind() override
For AST-based actions, the kind of translation unit we're handling.
std::unique_ptr< FrontendAction > WrappedAction
Information about a module that has been loaded by the ASTReader.
std::string ModuleName
The name of the module.
Defines the clang::TargetInfo interface.
@ HeaderSearch
Remove unused header search paths including header maps.
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
void HandleRootSignatureTarget(Sema &S, StringRef EntryRootSig)
IdentifierInfo * ParseHLSLRootSignature(Sema &Actions, llvm::dxbc::RootSignatureVersion Version, StringLiteral *Signature)
@ MK_PCH
File is a PCH file treated as such.
@ MK_Preamble
File is a PCH file treated as the preamble.
bool isStringLiteral(TokenKind K)
Return true if this is a C or C++ string-literal (or C++11 user-defined-string-literal) token.
The JSON file list parser is used to communicate input to InstallAPI.
void printDependencyDirectivesAsSource(StringRef Source, ArrayRef< dependency_directives_scan::Directive > Directives, llvm::raw_ostream &OS)
Print the previously scanned dependency directives as minimized source text.
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.
std::string createSpecificModuleCachePath(FileManager &FileMgr, StringRef ModuleCachePath, bool DisableModuleHash, std::string ContextHash)
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...
ActionResult< Expr * > ExprResult
unsigned Size
Size of the preamble in bytes.