24 #include "llvm/Support/FileSystem.h" 25 #include "llvm/Support/MemoryBuffer.h" 26 #include "llvm/Support/Path.h" 27 #include "llvm/Support/raw_ostream.h" 28 #include "llvm/Support/YAMLTraits.h" 30 #include <system_error> 32 using namespace clang;
47 GetCodeCompletionConsumer(CI));
55 std::unique_ptr<ASTConsumer>
57 return llvm::make_unique<ASTConsumer>();
60 void InitOnlyAction::ExecuteAction() {
67 std::unique_ptr<ASTConsumer>
69 if (std::unique_ptr<raw_ostream> OS =
75 std::unique_ptr<ASTConsumer>
84 std::unique_ptr<ASTConsumer>
89 std::unique_ptr<ASTConsumer>
94 std::unique_ptr<ASTConsumer>
97 if (!ComputeASTConsumerArguments(CI, Sysroot))
100 std::string OutputFile;
101 std::unique_ptr<raw_pwrite_stream> OS =
102 CreateOutputFile(CI, InFile, OutputFile);
110 auto Buffer = std::make_shared<PCHBuffer>();
111 std::vector<std::unique_ptr<ASTConsumer>> Consumers;
112 Consumers.push_back(llvm::make_unique<PCHGenerator>(
114 Buffer, FrontendOpts.ModuleFileExtensions,
116 FrontendOpts.IncludeTimestamps));
118 CI, InFile, OutputFile, std::move(OS), Buffer));
120 return llvm::make_unique<MultiplexConsumer>(std::move(Consumers));
124 std::string &Sysroot) {
134 std::unique_ptr<llvm::raw_pwrite_stream>
136 std::string &OutputFile) {
140 std::unique_ptr<raw_pwrite_stream> OS =
162 std::unique_ptr<ASTConsumer>
165 std::unique_ptr<raw_pwrite_stream> OS = CreateOutputFile(CI, InFile);
172 auto Buffer = std::make_shared<PCHBuffer>();
173 std::vector<std::unique_ptr<ASTConsumer>> Consumers;
175 Consumers.push_back(llvm::make_unique<PCHGenerator>(
182 CI, InFile, OutputFile, std::move(OS), Buffer));
183 return llvm::make_unique<MultiplexConsumer>(std::move(Consumers));
186 bool GenerateModuleFromModuleMapAction::BeginSourceFileAction(
196 std::unique_ptr<raw_pwrite_stream>
203 if (ModuleMapFile.empty())
204 ModuleMapFile = InFile;
221 bool GenerateModuleInterfaceAction::BeginSourceFileAction(
233 std::unique_ptr<raw_pwrite_stream>
239 bool GenerateHeaderModuleAction::PrepareToExecuteAction(
250 auto Kind = Inputs[0].getKind();
254 ModuleHeaders.reserve(Inputs.size());
259 << (FIF.isFile() ? FIF.getFile()
260 : FIF.getBuffer()->getBufferIdentifier());
264 HeaderContents +=
"#include \"";
265 HeaderContents += FIF.getFile();
266 HeaderContents +=
"\"\n";
267 ModuleHeaders.push_back(FIF.getFile());
269 Buffer = llvm::MemoryBuffer::getMemBufferCopy(
279 bool GenerateHeaderModuleAction::BeginSourceFileAction(
286 for (StringRef Name : ModuleHeaders) {
290 None,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr);
296 Headers.push_back({Name, FE});
303 std::unique_ptr<raw_pwrite_stream>
312 std::unique_ptr<ASTConsumer>
314 return llvm::make_unique<ASTConsumer>();
317 std::unique_ptr<ASTConsumer>
320 return llvm::make_unique<ASTConsumer>();
323 std::unique_ptr<ASTConsumer>
325 return llvm::make_unique<ASTConsumer>();
332 std::unique_ptr<ASTReader> Reader(
new ASTReader(
335 Sysroot.empty() ?
"" : Sysroot.c_str(),
349 struct TemplightEntry {
353 std::string DefinitionLocation;
354 std::string PointOfInstantiation;
360 template <>
struct MappingTraits<TemplightEntry> {
361 static void mapping(IO &io, TemplightEntry &fields) {
362 io.mapRequired(
"name", fields.Name);
363 io.mapRequired(
"kind", fields.Kind);
364 io.mapRequired(
"event", fields.Event);
365 io.mapRequired(
"orig", fields.DefinitionLocation);
366 io.mapRequired(
"poi", fields.PointOfInstantiation);
382 const CodeSynthesisContext &Inst)
override {
383 displayTemplightEntry<true>(llvm::outs(), TheSema, Inst);
387 const CodeSynthesisContext &Inst)
override {
388 displayTemplightEntry<false>(llvm::outs(), TheSema, Inst);
392 static std::string
toString(CodeSynthesisContext::SynthesisKind
Kind) {
394 case CodeSynthesisContext::TemplateInstantiation:
395 return "TemplateInstantiation";
396 case CodeSynthesisContext::DefaultTemplateArgumentInstantiation:
397 return "DefaultTemplateArgumentInstantiation";
398 case CodeSynthesisContext::DefaultFunctionArgumentInstantiation:
399 return "DefaultFunctionArgumentInstantiation";
400 case CodeSynthesisContext::ExplicitTemplateArgumentSubstitution:
401 return "ExplicitTemplateArgumentSubstitution";
402 case CodeSynthesisContext::DeducedTemplateArgumentSubstitution:
403 return "DeducedTemplateArgumentSubstitution";
404 case CodeSynthesisContext::PriorTemplateArgumentSubstitution:
405 return "PriorTemplateArgumentSubstitution";
406 case CodeSynthesisContext::DefaultTemplateArgumentChecking:
407 return "DefaultTemplateArgumentChecking";
408 case CodeSynthesisContext::ExceptionSpecEvaluation:
409 return "ExceptionSpecEvaluation";
410 case CodeSynthesisContext::ExceptionSpecInstantiation:
411 return "ExceptionSpecInstantiation";
412 case CodeSynthesisContext::DeclaringSpecialMember:
413 return "DeclaringSpecialMember";
414 case CodeSynthesisContext::DefiningSynthesizedFunction:
415 return "DefiningSynthesizedFunction";
416 case CodeSynthesisContext::Memoization:
417 return "Memoization";
422 template <
bool BeginInstantiation>
423 static void displayTemplightEntry(llvm::raw_ostream &Out,
const Sema &TheSema,
424 const CodeSynthesisContext &Inst) {
427 llvm::raw_string_ostream OS(YAML);
428 llvm::yaml::Output YO(OS);
429 TemplightEntry Entry =
430 getTemplightEntry<BeginInstantiation>(TheSema, Inst);
431 llvm::yaml::EmptyContext Context;
432 llvm::yaml::yamlize(YO, Entry,
true, Context);
434 Out <<
"---" << YAML <<
"\n";
437 template <
bool BeginInstantiation>
438 static TemplightEntry getTemplightEntry(
const Sema &TheSema,
439 const CodeSynthesisContext &Inst) {
440 TemplightEntry Entry;
442 Entry.Event = BeginInstantiation ?
"Begin" :
"End";
443 if (
auto *NamedTemplate = dyn_cast_or_null<NamedDecl>(Inst.Entity)) {
444 llvm::raw_string_ostream OS(Entry.Name);
445 NamedTemplate->getNameForDiagnostic(OS, TheSema.
getLangOpts(),
true);
449 Entry.DefinitionLocation = std::string(DefLoc.
getFilename()) +
":" +
450 std::to_string(DefLoc.
getLine()) +
":" +
456 Entry.PointOfInstantiation = std::string(PoiLoc.
getFilename()) +
":" +
457 std::to_string(PoiLoc.
getLine()) +
":" +
465 std::unique_ptr<ASTConsumer>
467 return llvm::make_unique<ASTConsumer>();
477 EnsureSemaIsCreated(CI, *
this);
480 llvm::make_unique<DefaultTemplateInstCallback>());
488 llvm::raw_ostream &Out;
491 DumpModuleInfoListener(llvm::raw_ostream &Out) : Out(Out) { }
493 #define DUMP_BOOLEAN(Value, Text) \ 494 Out.indent(4) << Text << ": " << (Value? "Yes" : "No") << "\n" 496 bool ReadFullVersionInformation(StringRef FullVersion)
override {
501 <<
" Clang: " << FullVersion <<
"\n";
505 void ReadModuleName(StringRef ModuleName)
override {
506 Out.indent(2) <<
"Module name: " << ModuleName <<
"\n";
508 void ReadModuleMapFile(StringRef ModuleMapPath)
override {
509 Out.indent(2) <<
"Module map file: " << ModuleMapPath <<
"\n";
512 bool ReadLanguageOptions(
const LangOptions &LangOpts,
bool Complain,
513 bool AllowCompatibleDifferences)
override {
514 Out.indent(2) <<
"Language options:\n";
515 #define LANGOPT(Name, Bits, Default, Description) \ 516 DUMP_BOOLEAN(LangOpts.Name, Description); 517 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 518 Out.indent(4) << Description << ": " \ 519 << static_cast<unsigned>(LangOpts.get##Name()) << "\n"; 520 #define VALUE_LANGOPT(Name, Bits, Default, Description) \ 521 Out.indent(4) << Description << ": " << LangOpts.Name << "\n"; 522 #define BENIGN_LANGOPT(Name, Bits, Default, Description) 523 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) 524 #include "clang/Basic/LangOptions.def" 527 Out.indent(4) <<
"Module features:\n";
529 Out.indent(6) << Feature <<
"\n";
535 bool ReadTargetOptions(
const TargetOptions &TargetOpts,
bool Complain,
536 bool AllowCompatibleDifferences)
override {
537 Out.indent(2) <<
"Target options:\n";
538 Out.indent(4) <<
" Triple: " << TargetOpts.
Triple <<
"\n";
539 Out.indent(4) <<
" CPU: " << TargetOpts.
CPU <<
"\n";
540 Out.indent(4) <<
" ABI: " << TargetOpts.
ABI <<
"\n";
543 Out.indent(4) <<
"Target features:\n";
554 bool Complain)
override {
555 Out.indent(2) <<
"Diagnostic options:\n";
556 #define DIAGOPT(Name, Bits, Default) DUMP_BOOLEAN(DiagOpts->Name, #Name); 557 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 558 Out.indent(4) << #Name << ": " << DiagOpts->get##Name() << "\n"; 559 #define VALUE_DIAGOPT(Name, Bits, Default) \ 560 Out.indent(4) << #Name << ": " << DiagOpts->Name << "\n"; 561 #include "clang/Basic/DiagnosticOptions.def" 563 Out.indent(4) <<
"Diagnostic flags:\n";
564 for (
const std::string &
Warning : DiagOpts->Warnings)
565 Out.indent(6) <<
"-W" << Warning <<
"\n";
566 for (
const std::string &
Remark : DiagOpts->Remarks)
567 Out.indent(6) <<
"-R" << Remark <<
"\n";
573 StringRef SpecificModuleCachePath,
574 bool Complain)
override {
575 Out.indent(2) <<
"Header search options:\n";
576 Out.indent(4) <<
"System root [-isysroot=]: '" << HSOpts.
Sysroot <<
"'\n";
577 Out.indent(4) <<
"Resource dir [ -resource-dir=]: '" << HSOpts.
ResourceDir <<
"'\n";
578 Out.indent(4) <<
"Module Cache: '" << SpecificModuleCachePath <<
"'\n";
580 "Use builtin include directories [-nobuiltininc]");
582 "Use standard system include directories [-nostdinc]");
584 "Use standard C++ include directories [-nostdinc++]");
586 "Use libc++ (rather than libstdc++) [-stdlib=]");
592 std::string &SuggestedPredefines)
override {
593 Out.indent(2) <<
"Preprocessor options:\n";
595 "Uses compiler/target-specific predefines [-undef]");
597 "Uses detailed preprocessing record (for indexing)");
599 if (!PPOpts.
Macros.empty()) {
600 Out.indent(4) <<
"Predefined macros:\n";
603 for (std::vector<std::pair<std::string, bool/*isUndef*/> >::const_iterator
611 Out << I->first <<
"\n";
617 void readModuleFileExtension(
619 Out.indent(2) <<
"Module file extension '" 624 Out.write_escaped(Metadata.
UserInfo);
632 bool needsInputFileVisitation()
override {
return true; }
636 bool needsSystemInputFileVisitation()
override {
return true; }
642 bool isOverridden,
bool isExplicitModule)
override {
644 Out.indent(2) <<
"Input file: " <<
Filename;
646 if (isSystem || isOverridden || isExplicitModule) {
650 if (isOverridden || isExplicitModule)
655 if (isExplicitModule)
658 if (isExplicitModule)
659 Out <<
"ExplicitModule";
671 bool needsImportVisitation()
const override {
return true; }
675 void visitImport(StringRef ModuleName, StringRef Filename)
override {
676 Out.indent(2) <<
"Imports module '" << ModuleName
677 <<
"': " << Filename.str() <<
"\n";
692 std::unique_ptr<llvm::raw_fd_ostream> OutFile;
694 if (!OutputFileName.empty() && OutputFileName !=
"-") {
696 OutFile.reset(
new llvm::raw_fd_ostream(OutputFileName.str(), EC,
697 llvm::sys::fs::F_Text));
699 llvm::raw_ostream &Out = OutFile.get()? *OutFile.get() : llvm::outs();
701 Out <<
"Information for module file '" <<
getCurrentFile() <<
"':\n";
704 StringRef Magic = (*Buffer)->getMemBufferRef().getBuffer();
705 bool IsRaw = (Magic.size() >= 4 && Magic[0] ==
'C' && Magic[1] ==
'P' &&
706 Magic[2] ==
'C' && Magic[3] ==
'H');
707 Out <<
" Module format: " << (IsRaw ?
"raw" :
"obj") <<
"\n";
710 DumpModuleInfoListener Listener(Out);
712 PP.getHeaderSearchInfo().getHeaderSearchOpts();
733 RawLex.LexFromRawLexer(RawTok);
736 llvm::errs() <<
"\n";
737 RawLex.LexFromRawLexer(RawTok);
749 llvm::errs() <<
"\n";
782 bool BinaryMode =
true;
783 bool InvalidFile =
false;
788 const char *cur = Buffer->getBufferStart();
789 const char *end = Buffer->getBufferEnd();
790 const char *next = (cur != end) ? cur + 1 : end;
795 if (end - cur > 256) end = cur + 256;
803 }
else if (*cur == 0x0A)
811 std::unique_ptr<raw_ostream> OS =
819 if (Input.isFile()) {
821 OS->write_escaped(Input.getFile());
825 (*OS) <<
"#pragma clang module contents\n";
860 llvm::outs().write((*Buffer)->getBufferStart(),
Preamble);
864 void DumpCompilerOptionsAction::ExecuteAction() {
866 std::unique_ptr<raw_ostream> OSP =
871 raw_ostream &OS = *OSP;
881 OS <<
"\n\"features\" : [\n";
884 #define FEATURE(Name, Predicate) \ 885 ("\t{\"" #Name "\" : " + llvm::Twine(Predicate ? "true" : "false") + "},\n") \ 887 #include "clang/Basic/Features.def" 891 OS << Str.substr(0, Str.size() - 2);
895 OS <<
"\n\"extensions\" : [\n";
898 #define EXTENSION(Name, Predicate) \ 899 ("\t{\"" #Name "\" : " + llvm::Twine(Predicate ? "true" : "false") + "},\n") \ 901 #include "clang/Basic/Features.def" 905 OS << Str.substr(0, Str.size() - 2);
std::string OutputFile
The output file, if any.
LangOptions & getLangOpts()
std::string OriginalModuleMap
When the input is a module map, the original module map file from which that map was inferred...
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
PreprocessorOptions & getPreprocessorOpts()
bool shouldEraseOutputFiles() override
Callback at the end of processing a single input, to determine if the output files should be erased o...
void createCodeCompletionConsumer()
Create a code completion consumer using the invocation; note that this will cause the source manager ...
std::vector< std::pair< std::string, bool > > Macros
Lexer - This provides a simple interface that turns a text buffer into a stream of tokens...
std::vector< std::unique_ptr< TemplateInstantiationCallback > > TemplateInstCallbacks
The template instantiation callbacks to trace or track instantiations (objects can be chained)...
Defines the clang::FileManager interface and associated types.
DominatorTree GraphTraits specialization so the DominatorTree can be iterable by generic graph iterat...
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.
void createSema(TranslationUnitKind TUKind, CodeCompleteConsumer *CompletionConsumer)
Create the Sema object to be used for parsing.
Abstract base class for actions which can be performed by the frontend.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
void finalize(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema)
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::string ASTDumpFilter
If given, filter dumped AST Decl nodes by this substring.
ASTContext & getASTContext() const
Compiling a C++ modules TS module interface unit.
void IgnorePragmas()
Install empty handlers for all pragmas (making them ignored).
Options for controlling the target.
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
virtual bool hasCodeCompletionSupport() const
Does this action support use with code completion?
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
static StringRef getModuleInputBufferName()
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
Module * getCurrentModule() const
Token - This structure provides full information about a lexed token.
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
const LangOptions & getLangOpts() const
unsigned BuildingImplicitModule
Whether we are performing an implicit module build.
bool BeginSourceFileAction(CompilerInstance &CI) override
Callback at the start of processing a single input.
unsigned RelocatablePCH
When generating PCH files, instruct the AST writer to create relocatable PCH files.
static bool ComputeASTConsumerArguments(CompilerInstance &CI, std::string &Sysroot)
Compute the AST consumer arguments that will be used to create the PCHGenerator instance returned by ...
This is a base class for callbacks that will be notified at every template instantiation.
CompilerInstance & getCompilerInstance() const
const PCHContainerWriter & getPCHContainerWriter() const
Return the appropriate PCHContainerWriter depending on the current CodeGenOptions.
HeaderSearch & getHeaderSearchInfo() const
FrontendOptions & getFrontendOpts()
static void mapping(IO &io, TemplightEntry &fields)
StringRef getCurrentFileOrBufferName() const
PreprocessorOutputOptions & getPreprocessorOutputOpts()
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
virtual bool BeginInvocation(CompilerInstance &CI)
Callback before starting processing a single input, giving the opportunity to modify the CompilerInvo...
bool BeginInvocation(CompilerInstance &CI) override
Callback before starting processing a single input, giving the opportunity to modify the CompilerInvo...
#define DUMP_BOOLEAN(Value, Text)
const LangOptions & getLangOpts() const
HeaderSearchOptions & getHeaderSearchOpts()
void ExecuteAction() override
Implement the ExecuteAction interface by running Sema on the already-initialized AST consumer...
CodeCompleteConsumer & getCodeCompletionConsumer() const
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
Sema - This implements semantic analysis and AST building for C.
std::string CurrentModule
The name of the current module, of which the main source file is a part.
virtual bool shouldEraseOutputFiles()
Callback at the end of processing a single input, to determine if the output files should be erased o...
unsigned ASTDumpAll
Whether we deserialize all decls when forming AST dumps.
std::unique_ptr< ASTConsumer > CreateASTDumper(std::unique_ptr< raw_ostream > OS, StringRef FilterString, bool DumpDecls, bool Deserialize, bool DumpLookups)
void DoPrintPreprocessedInput(Preprocessor &PP, raw_ostream *OS, const PreprocessorOutputOptions &Opts)
DoPrintPreprocessedInput - Implement -E mode.
void ExecuteAction() override
Implement the ExecuteAction interface by running Sema on the already-initialized AST consumer...
static PreambleBounds ComputePreamble(StringRef Buffer, const LangOptions &LangOpts, unsigned MaxLines=0)
Compute the preamble of the given file.
bool isInvalid() const
Return true if this object is invalid or uninitialized.
unsigned getLine() const
Return the presumed line number of this location.
Compiling a module from a list of header files.
void EnterMainSourceFile()
Enter the specified FileID as the main source file, which implicitly adds the builtin defines etc...
void print(raw_ostream &OS, unsigned Indent=0) const
Print the module map for this module to the given stream.
Defines the clang::Preprocessor interface.
Represents an unpacked "presumed" location which can be presented to the user.
InputKind getCurrentFileKind() const
std::unique_ptr< raw_pwrite_stream > createOutputFile(StringRef OutputPath, bool Binary, bool RemoveFileOnSignal, StringRef BaseInput, StringRef Extension, bool UseTemporary, bool CreateMissingDirectories=false)
Create a new output file and add it to the list of tracked output files, optionally deriving the outp...
DirectoryLookup - This class represents one entry in the search list that specifies the search order ...
bool AllowPCHWithCompilerErrors
When true, a PCH with compiler errors will not be rejected.
std::string CPU
If given, the name of the target CPU to generate code for.
SourceManager & getSourceManager() const
const char * getFilename() const
Return the presumed filename of this location.
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
llvm::MemoryBuffer * getBuffer(FileID FID, SourceLocation Loc, bool *Invalid=nullptr) const
Return the buffer for the specified FileID.
std::string ABI
If given, the name of the target ABI to use.
File is a PCH file treated as the preamble.
unsigned getColumn() const
Return the presumed column number of this location.
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
CompilerInstance - Helper class for managing a single instance of the Clang compiler.
Encodes a location in the source.
void atTemplateBegin(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema, const Sema::CodeSynthesisContext &Inst)
File is a PCH file treated as such.
ParsedSourceLocation CodeCompletionAt
If given, enable code completion at the provided location.
virtual TranslationUnitKind getTranslationUnitKind()
For AST-based actions, the kind of translation unit we're handling.
std::vector< FrontendInputFile > Inputs
The input files and their types.
Cached information about one file (either on disk or in the virtual file system). ...
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
void Lex(Token &Result)
Lex the next token for this preprocessor.
virtual bool PrepareToExecuteAction(CompilerInstance &CI)
Prepare to execute the action on the given CompilerInstance.
virtual bool ReadFullVersionInformation(StringRef FullVersion)
Receives the full Clang version information.
unsigned ASTDumpLookups
Whether we include lookup table dumps in AST dumps.
std::vector< std::string > FeaturesAsWritten
The list of target specific features to enable or disable, as written on the command line...
void DumpToken(const Token &Tok, bool DumpFlags=false) const
Print the token to stderr, used for debugging.
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
Abstract interface for a consumer of code-completion information.
bool isNot(tok::TokenKind K) const
Dataflow Directional Tag Classes.
FileManager & getFileManager() const
Return the current file manager to the caller.
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
const FrontendInputFile & getCurrentInput() const
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
Reads an AST files chain containing the contents of a translation unit.
FileID getMainFileID() const
Returns the FileID of the main source file.
StringRef getCurrentFile() const
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(const FileEntry *Entry, bool isVolatile=false, bool ShouldCloseOpenFile=true)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful, otherwise returning null.
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...
SourceManager & getSourceManager() const
Return the current source manager.
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.
Abstract interface for callback invocations by the ASTReader.
~SyntaxOnlyAction() override
std::vector< std::shared_ptr< ModuleFileExtension > > ModuleFileExtensions
The list of module file extensions.
std::unique_ptr< raw_pwrite_stream > createDefaultOutputFile(bool Binary=true, StringRef BaseInput="", StringRef Extension="")
Create the default output file (from the invocation's options) and add it to the list of tracked outp...
std::unique_ptr< ASTConsumer > CreateASTViewer()
Preprocessor & getPreprocessor() const
Return the current preprocessor.
bool hasCodeCompletionConsumer() const
std::unique_ptr< ASTConsumer > CreateASTDeclNodeLister()
virtual bool BeginSourceFileAction(CompilerInstance &CI)
Callback at the start of processing a single input.
unsigned ASTDumpDecls
Whether we include declaration dumps in AST dumps.
void atTemplateEnd(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema, const Sema::CodeSynthesisContext &Inst)
const PCHContainerReader & getPCHContainerReader() const
Return the appropriate PCHContainerReader depending on the current CodeGenOptions.
SourceManager & getSourceManager() const
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
std::pair< unsigned, bool > PrecompiledPreambleBytes
If non-zero, the implicit PCH include is actually a precompiled preamble that covers this number of b...
DiagnosticsEngine & getDiagnostics() const
Get the current diagnostics engine.
void initialize(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema)
static bool readASTFileControlBlock(StringRef Filename, FileManager &FileMgr, const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions, ASTReaderListener &Listener, bool ValidateDiagnosticOptions)
Read the control block for the named AST file.
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.
std::unique_ptr< ASTConsumer > CreateASTPrinter(std::unique_ptr< raw_ostream > OS, StringRef FilterString)
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
void SetKeepWhitespaceMode(bool Val)
SetKeepWhitespaceMode - This method lets clients enable or disable whitespace retention mode...
std::string Triple
The name of the target triple to compile for.
bool isSystem(CharacteristicKind CK)
Determine whether a file / directory characteristic is for system code.
This class handles loading and caching of source files into memory.
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
void ExecuteAction() override
Implement the ExecuteAction interface by running Sema on the already-initialized AST consumer...