30#include "llvm/Config/llvm-config.h"
31#include "llvm/Support/ErrorHandling.h"
32#include "llvm/Support/FileSystem.h"
33#include "llvm/Support/MemoryBuffer.h"
34#include "llvm/Support/YAMLTraits.h"
35#include "llvm/Support/raw_ostream.h"
38#include <system_error>
46std::unique_ptr<ASTConsumer>
48 return std::make_unique<ASTConsumer>();
69std::unique_ptr<ASTConsumer>
72 return std::make_unique<ASTConsumer>();
79std::unique_ptr<ASTConsumer>
81 if (std::unique_ptr<raw_ostream> OS =
87std::unique_ptr<ASTConsumer>
96std::unique_ptr<ASTConsumer>
101std::unique_ptr<ASTConsumer>
106std::unique_ptr<ASTConsumer>
112 std::string OutputFile;
113 std::unique_ptr<raw_pwrite_stream> OS =
122 auto Buffer = std::make_shared<PCHBuffer>();
123 std::vector<std::unique_ptr<ASTConsumer>> Consumers;
124 Consumers.push_back(std::make_unique<PCHGenerator>(
128 FrontendOpts.IncludeTimestamps, FrontendOpts.BuildingImplicitModule));
130 CI, std::string(InFile), OutputFile, std::move(OS), Buffer));
132 return std::make_unique<MultiplexConsumer>(std::move(Consumers));
136 std::string &Sysroot) {
146std::unique_ptr<llvm::raw_pwrite_stream>
148 std::string &OutputFile,
152 true, InFile,
"",
false,
173std::vector<std::unique_ptr<ASTConsumer>>
177 OS = CreateOutputFile(CI, InFile);
184 auto Buffer = std::make_shared<PCHBuffer>();
185 std::vector<std::unique_ptr<ASTConsumer>> Consumers;
187 Consumers.push_back(std::make_unique<PCHGenerator>(
197 CI, std::string(InFile), OutputFile, std::move(OS), Buffer));
201std::unique_ptr<ASTConsumer>
204 std::vector<std::unique_ptr<ASTConsumer>> Consumers =
206 if (Consumers.empty())
209 return std::make_unique<MultiplexConsumer>(std::move(Consumers));
217bool GenerateModuleFromModuleMapAction::BeginSourceFileAction(
227std::unique_ptr<raw_pwrite_stream>
234 if (ModuleMapFile.empty())
235 ModuleMapFile = InFile;
254 if (
const auto InputFormat = FIF.getKind().getFormat();
257 diag::err_frontend_action_unsupported_input_format)
258 <<
"module interface compilation" << FIF.getFile() << InputFormat;
272std::unique_ptr<ASTConsumer>
275 std::vector<std::unique_ptr<ASTConsumer>> Consumers;
279 Consumers.push_back(std::make_unique<ReducedBMIGenerator>(
285 Consumers.push_back(std::make_unique<CXX20ModulesGenerator>(
290 return std::make_unique<MultiplexConsumer>(std::move(Consumers));
293std::unique_ptr<raw_pwrite_stream>
299std::unique_ptr<ASTConsumer>
300GenerateReducedModuleInterfaceAction::CreateASTConsumer(
CompilerInstance &CI,
302 return std::make_unique<ReducedBMIGenerator>(
316std::unique_ptr<raw_pwrite_stream>
325std::unique_ptr<ASTConsumer>
327 return std::make_unique<ASTConsumer>();
330std::unique_ptr<ASTConsumer>
333 return std::make_unique<ASTConsumer>();
336std::unique_ptr<ASTConsumer>
338 return std::make_unique<ASTConsumer>();
345 std::unique_ptr<ASTReader> Reader(
new ASTReader(
349 Sysroot.empty() ?
"" : Sysroot.c_str(),
364 llvm::raw_ostream &Out;
371#define DUMP_BOOLEAN(Value, Text) \
372 Out.indent(4) << Text << ": " << (Value? "Yes" : "No") << "\n"
374 bool ReadFullVersionInformation(StringRef FullVersion)
override {
379 <<
" Clang: " << FullVersion <<
"\n";
383 void ReadModuleName(StringRef ModuleName)
override {
384 Out.indent(2) <<
"Module name: " << ModuleName <<
"\n";
386 void ReadModuleMapFile(StringRef ModuleMapPath)
override {
387 Out.indent(2) <<
"Module map file: " << ModuleMapPath <<
"\n";
390 bool ReadLanguageOptions(
const LangOptions &LangOpts,
391 StringRef ModuleFilename,
bool Complain,
392 bool AllowCompatibleDifferences)
override {
394 using CK = LangOptions::CompatibilityKind;
396 Out.indent(2) <<
"Language options:\n";
397#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
398 if constexpr (CK::Compatibility != CK::Benign) \
399 DUMP_BOOLEAN(LangOpts.Name, Description);
400#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
401 if constexpr (CK::Compatibility != CK::Benign) \
402 Out.indent(4) << Description << ": " \
403 << static_cast<unsigned>(LangOpts.get##Name()) << "\n";
404#define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description) \
405 if constexpr (CK::Compatibility != CK::Benign) \
406 Out.indent(4) << Description << ": " << LangOpts.Name << "\n";
407#include "clang/Basic/LangOptions.def"
410 Out.indent(4) <<
"Module features:\n";
418 bool ReadTargetOptions(
const TargetOptions &TargetOpts,
419 StringRef ModuleFilename,
bool Complain,
420 bool AllowCompatibleDifferences)
override {
421 Out.indent(2) <<
"Target options:\n";
422 Out.indent(4) <<
" Triple: " << TargetOpts.
Triple <<
"\n";
423 Out.indent(4) <<
" CPU: " << TargetOpts.
CPU <<
"\n";
424 Out.indent(4) <<
" TuneCPU: " << TargetOpts.
TuneCPU <<
"\n";
425 Out.indent(4) <<
" ABI: " << TargetOpts.
ABI <<
"\n";
428 Out.indent(4) <<
"Target features:\n";
438 bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts,
439 StringRef ModuleFilename,
440 bool Complain)
override {
441 Out.indent(2) <<
"Diagnostic options:\n";
442#define DIAGOPT(Name, Bits, Default) DUMP_BOOLEAN(DiagOpts.Name, #Name);
443#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
444 Out.indent(4) << #Name << ": " \
445 << static_cast<unsigned>(DiagOpts.get##Name()) << "\n";
446#define VALUE_DIAGOPT(Name, Bits, Default) \
447 Out.indent(4) << #Name << ": " << DiagOpts.Name << "\n";
448#include "clang/Basic/DiagnosticOptions.def"
450 Out.indent(4) <<
"Diagnostic flags:\n";
459 bool ReadHeaderSearchOptions(
const HeaderSearchOptions &HSOpts,
460 StringRef ModuleFilename,
461 StringRef ContextHash,
462 bool Complain)
override {
465 std::string(ContextHash));
467 Out.indent(2) <<
"Header search options:\n";
468 Out.indent(4) <<
"System root [-isysroot=]: '" << HSOpts.
Sysroot <<
"'\n";
469 Out.indent(4) <<
"Resource dir [ -resource-dir=]: '" << HSOpts.
ResourceDir <<
"'\n";
470 Out.indent(4) <<
"Module Cache: '" << SpecificModuleCachePath <<
"'\n";
472 "Use builtin include directories [-nobuiltininc]");
474 "Use standard system include directories [-nostdinc]");
476 "Use standard C++ include directories [-nostdinc++]");
478 "Use libc++ (rather than libstdc++) [-stdlib=]");
482 bool ReadHeaderSearchPaths(
const HeaderSearchOptions &HSOpts,
483 bool Complain)
override {
484 Out.indent(2) <<
"Header search paths:\n";
485 Out.indent(4) <<
"User entries:\n";
487 Out.indent(6) << Entry.Path <<
"\n";
488 Out.indent(4) <<
"System header prefixes:\n";
490 Out.indent(6) << Prefix.Prefix <<
"\n";
491 Out.indent(4) <<
"VFS overlay files:\n";
493 Out.indent(6) << Overlay <<
"\n";
497 bool ReadPreprocessorOptions(
const PreprocessorOptions &PPOpts,
498 StringRef ModuleFilename,
bool ReadMacros,
500 std::string &SuggestedPredefines)
override {
501 Out.indent(2) <<
"Preprocessor options:\n";
503 "Uses compiler/target-specific predefines [-undef]");
505 "Uses detailed preprocessing record (for indexing)");
508 Out.indent(4) <<
"Predefined macros:\n";
511 for (std::vector<std::pair<std::string, bool/*isUndef*/> >::const_iterator
519 Out << I->first <<
"\n";
525 void readModuleFileExtension(
526 const ModuleFileExtensionMetadata &Metadata)
override {
527 Out.indent(2) <<
"Module file extension '"
540 bool needsInputFileVisitation()
override {
return true; }
544 bool needsSystemInputFileVisitation()
override {
return true; }
549 bool visitInputFileAsRequested(StringRef FilenameAsRequested,
550 StringRef Filename,
bool isSystem,
551 bool isOverridden, time_t StoredTime,
552 bool isExplicitModule)
override {
554 Out.indent(2) <<
"Input file: " << FilenameAsRequested;
556 if (isSystem || isOverridden || isExplicitModule) {
560 if (isOverridden || isExplicitModule)
565 if (isExplicitModule)
568 if (isExplicitModule)
569 Out <<
"ExplicitModule";
577 Out.indent(4) <<
"MTime: " << llvm::itostr(StoredTime) <<
"\n";
584 bool needsImportVisitation()
const override {
return true; }
588 void visitImport(StringRef ModuleName, StringRef Filename)
override {
589 Out.indent(2) <<
"Imports module '" << ModuleName
590 <<
"': " << Filename.str() <<
"\n";
606 return "Module Map Module";
608 return "Interface Unit";
610 return "Implementation Unit";
612 return "Partition Interface";
614 return "Partition Implementation";
616 return "Header Unit";
618 return "Global Module Fragment";
620 return "Implicit Module Fragment";
622 return "Private Module Fragment";
624 llvm_unreachable(
"unknown module kind!");
639 if (!OutputFileName.empty() && OutputFileName !=
"-") {
641 OutputStream.reset(
new llvm::raw_fd_ostream(
642 OutputFileName.str(), EC, llvm::sys::fs::OF_TextWithCRLF));
644 llvm::raw_ostream &Out = OutputStream ? *OutputStream : llvm::outs();
646 Out <<
"Information for module file '" <<
getCurrentFile() <<
"':\n";
649 StringRef Magic = (*Buffer)->getMemBufferRef().getBuffer();
650 bool IsRaw = Magic.starts_with(
"CPCH");
651 Out <<
" Module format: " << (IsRaw ?
"raw" :
"obj") <<
"\n";
656 PP.getHeaderSearchInfo().getHeaderSearchOpts();
665 unsigned SubModuleCount = R->getTotalNumSubmodules();
667 Out <<
" ====== C++20 Module structure ======\n";
670 Out <<
" Mismatched module names : " << MF.
ModuleName <<
" and "
680 std::map<std::string, SubModInfo> SubModMap;
683 auto I = SubModMap.find(Name);
684 if (I == SubModMap.end())
685 Out <<
" was not found in the sub modules!\n";
687 I->second.Seen =
true;
688 Out <<
" is at index #" << I->second.Idx <<
"\n";
691 Module *Primary =
nullptr;
692 for (
unsigned Idx = 0; Idx <= SubModuleCount; ++Idx) {
693 Module *M = R->getModule(Idx);
699 <<
"' is the Primary Module at index #" << Idx <<
"\n";
700 SubModMap.insert({M->
Name, {Idx, M, M->
Kind, M->Name,
true}});
702 SubModMap.insert({M->
Name, {Idx, M, M->
Kind, M->Name,
false}});
706 Out <<
" Sub Modules:\n";
708 PrintSubMapEntry(MI->Name, MI->Kind);
711 Out <<
" Imports:\n";
713 PrintSubMapEntry(IMP->
Name, IMP->
Kind);
716 Out <<
" Exports:\n";
717 for (
unsigned MN = 0, N = Primary->
Exports.size(); MN != N; ++MN) {
719 PrintSubMapEntry(M->Name, M->Kind);
728 std::vector<StringRef> MacroNames;
729 for (
const auto &M : R->getPreprocessor().macros()) {
730 if (M.first->isFromAST())
731 MacroNames.push_back(M.first->getName());
733 llvm::sort(MacroNames);
734 if (!MacroNames.empty())
735 Out <<
" Macro Definitions:\n";
736 for (StringRef Name : MacroNames)
737 Out <<
" " << Name <<
"\n";
741 for (
const auto &SM : SubModMap) {
742 if (!SM.second.Seen && SM.second.Mod) {
744 <<
"' at index #" << SM.second.Idx
745 <<
" has no direct reference in the Primary\n";
748 Out <<
" ====== ======\n";
775 while (RawTok.
isNot(tok::eof)) {
777 llvm::errs() <<
"\n";
790 llvm::errs() <<
"\n";
791 }
while (
Tok.isNot(tok::eof));
805 }
while (
Tok.isNot(tok::eof));
824 bool BinaryMode =
false;
825 if (llvm::Triple(LLVM_HOST_TRIPLE).isOSWindows()) {
828 if (std::optional<llvm::MemoryBufferRef> Buffer =
830 const char *cur = Buffer->getBufferStart();
831 const char *end = Buffer->getBufferEnd();
832 const char *next = (cur != end) ? cur + 1 : end;
846 }
else if (*cur == 0x0A)
855 std::unique_ptr<raw_ostream> OS =
863 if (Input.isFile()) {
865 OS->write_escaped(Input.getFile());
869 (*OS) <<
"#pragma clang module contents\n";
906 llvm::outs().write((*Buffer)->getBufferStart(),
Preamble);
911 StringRef CompilerOptionNames,
913 bool FirstValue =
true;
914 for (
bool CompilerOptionValue : CompilerOptionValues) {
915 auto [CompilerOptionName, RemainingCompilerOptionNames] =
916 CompilerOptionNames.split(
'\0');
917 CompilerOptionNames = RemainingCompilerOptionNames;
921 OS <<
"\t{\"" << CompilerOptionName
922 <<
"\" : " << (CompilerOptionValue ?
"true" :
"false") <<
"}";
924 assert(CompilerOptionNames.empty() &&
"compiler option name count mismatch");
929 std::unique_ptr<raw_ostream> OSP =
934 raw_ostream &
OS = *OSP;
944 OS <<
"\n\"features\" : [\n";
946 static constexpr char FeatureNames[] = {
947#define FEATURE(Name, Predicate) #Name "\0"
948#include "clang/Basic/Features.def"
950 const bool FeatureValues[] = {
951#define FEATURE(Name, Predicate) static_cast<bool>(Predicate),
952#include "clang/Basic/Features.def"
955 OS, StringRef(FeatureNames,
sizeof(FeatureNames) - 1), FeatureValues);
959 OS <<
"\n\"extensions\" : [\n";
961 static constexpr char ExtensionNames[] = {
962#define EXTENSION(Name, Predicate) #Name "\0"
963#include "clang/Basic/Features.def"
965 const bool ExtensionValues[] = {
966#define EXTENSION(Name, Predicate) static_cast<bool>(Predicate),
967#include "clang/Basic/Features.def"
970 OS, StringRef(ExtensionNames,
sizeof(ExtensionNames) - 1),
989 "no errors reported for failure");
1001 }
while (
Tok.isNot(tok::eof));
1016 StringRef RootSigName;
1017 llvm::dxbc::RootSignatureVersion Version;
1019 std::optional<StringLiteral *> processStringLiteral(
ArrayRef<Token> Tokens) {
1022 return std::nullopt;
1024 ExprResult StringResult = Actions.ActOnUnevaluatedStringLiteral(Tokens);
1026 return std::nullopt;
1028 if (
auto Signature = dyn_cast<StringLiteral>(StringResult.
get()))
1031 return std::nullopt;
1041 auto Signature = processStringLiteral(MI->
tokens());
1042 if (!Signature.has_value()) {
1044 diag::err_expected_string_literal)
1045 << 4 <<
"RootSignature";
1051 Actions.HLSL().SetRootSignatureOverride(DeclIdent);
1055 llvm::dxbc::RootSignatureVersion Version)
1056 :
PPCallbacks(), Actions(Actions), RootSigName(RootSigName),
1076 bool IsRootSignatureTarget =
1082 StringRef RootSigName =
1085 auto MacroCallback = std::make_unique<InjectRootSignatureCallback>(
1092 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 BeginSourceFileAction(CompilerInstance &CI)
Callback at the start of processing a single input.
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 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.
FileID getMainFileID() const
Returns the FileID of the main source file.
llvm::MemoryBufferRef getBufferOrFake(FileID FID, SourceLocation Loc=SourceLocation()) const
Return the buffer for the specified FileID.
SourceLocation getLocForStartOfFile(FileID FID) const
Return the source location corresponding to the first byte of the specified file.
std::optional< llvm::MemoryBufferRef > getBufferOrNone(FileID FID, SourceLocation Loc=SourceLocation()) const
Return the buffer for the specified FileID.
~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.
Top level wrappers for InstallAPI frontend operations.
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.