44class CompilerInstance {
47 std::shared_ptr<CompilerInvocation> invocation;
50 std::shared_ptr<Fortran::parser::AllSources> allSources;
52 std::shared_ptr<Fortran::parser::AllCookedSources> allCookedSources;
54 std::shared_ptr<Fortran::parser::Parsing> parsing;
56 std::unique_ptr<Fortran::semantics::Semantics> semantics;
58 std::unique_ptr<Fortran::semantics::RuntimeDerivedTypeTables> rtTyTables;
60 std::unique_ptr<Fortran::semantics::SemanticsContext> semaContext;
62 std::unique_ptr<llvm::TargetMachine> targetMachine;
65 std::vector<std::unique_ptr<llvm::PassPlugin>> passPlugins;
68 llvm::raw_ostream *semaOutputStream = &llvm::errs();
71 std::unique_ptr<llvm::raw_ostream> ownedSemaOutputStream;
74 llvm::IntrusiveRefCntPtr<clang::DiagnosticsEngine> diagnostics;
79 OutputFile(std::string inputFilename)
80 : filename(std::move(inputFilename)) {}
84 std::list<OutputFile> outputFiles;
90 std::unique_ptr<llvm::raw_pwrite_stream> outputStream;
96 mlir::DefaultTimingManager timingMgr;
100 mlir::TimingScope timingScopeRoot;
108 std::unique_ptr<Fortran::support::string_ostream> timingStreamMLIR;
109 std::unique_ptr<Fortran::support::string_ostream> timingStreamLLVM;
110 std::unique_ptr<Fortran::support::string_ostream> timingStreamCodeGen;
114 explicit CompilerInstance();
122 assert(invocation &&
"Compiler instance has no invocation!");
127 void setInvocation(std::shared_ptr<CompilerInvocation> value);
136 bool hasAllSources()
const {
return allSources !=
nullptr; }
139 assert(allCookedSources &&
"Compiler instance has no AllCookedSources!");
140 return *allCookedSources;
181 void setSemantics(std::unique_ptr<Fortran::semantics::Semantics> sema) {
182 semantics = std::move(sema);
186 std::unique_ptr<Fortran::semantics::RuntimeDerivedTypeTables> tables) {
187 rtTyTables = std::move(tables);
190 Fortran::semantics::RuntimeDerivedTypeTables &getRtTyTables() {
191 assert(rtTyTables &&
"Missing runtime derived type tables!");
209 clang::DiagnosticOptions &getDiagnosticOpts() {
210 return invocation->getDiagnosticOpts();
212 const clang::DiagnosticOptions &getDiagnosticOpts()
const {
213 return invocation->getDiagnosticOpts();
216 FrontendOptions &getFrontendOpts() {
return invocation->getFrontendOpts(); }
217 const FrontendOptions &getFrontendOpts()
const {
218 return invocation->getFrontendOpts();
221 PreprocessorOptions &preprocessorOpts() {
222 return invocation->getPreprocessorOpts();
224 const PreprocessorOptions &preprocessorOpts()
const {
225 return invocation->getPreprocessorOpts();
232 bool hasDiagnostics()
const {
return diagnostics !=
nullptr; }
236 assert(diagnostics &&
"Compiler instance has no diagnostics!");
240 clang::DiagnosticConsumer &getDiagnosticClient()
const {
241 assert(diagnostics && diagnostics->getClient() &&
242 "Compiler instance has no diagnostic client!");
243 return *diagnostics->getClient();
264 std::unique_ptr<llvm::raw_pwrite_stream>
266 llvm::StringRef extension =
"");
272 void addPassPlugin(std::unique_ptr<llvm::PassPlugin> plugin) {
273 passPlugins.emplace_back(std::move(plugin));
286 assert(targetMachine &&
"target machine was not set");
287 return *targetMachine;
290 assert(targetMachine &&
"target machine was not set");
291 return *targetMachine;
303 bool isTimingEnabled()
const {
return timingMgr.isEnabled(); }
305 mlir::DefaultTimingManager &getTimingManager() {
return timingMgr; }
306 const mlir::DefaultTimingManager &getTimingManager()
const {
310 mlir::TimingScope &getTimingScopeRoot() {
return timingScopeRoot; }
311 const mlir::TimingScope &getTimingScopeRoot()
const {
312 return timingScopeRoot;
317 assert(timingStreamMLIR &&
"Timing stream for MLIR was not set");
318 return *timingStreamMLIR;
323 assert(timingStreamLLVM &&
"Timing stream for LLVM was not set");
324 return *timingStreamLLVM;
331 assert(timingStreamCodeGen &&
"Timing stream for codegen was not set");
332 return *timingStreamCodeGen;
342 llvm::Expected<std::unique_ptr<llvm::raw_pwrite_stream>>
343 createOutputFileImpl(llvm::StringRef outputPath,
bool binary);
365 static clang::IntrusiveRefCntPtr<clang::DiagnosticsEngine>
367 clang::DiagnosticConsumer *client =
nullptr,
368 bool shouldOwnClient =
true);
370 bool shouldOwnClient =
true);
375 void setOutputStream(std::unique_ptr<llvm::raw_pwrite_stream> outStream) {
376 outputStream = std::move(outStream);
379 bool isOutputStreamNull() {
return (outputStream ==
nullptr); }
382 void writeOutputStream(
const std::string &message) {
383 *outputStream << message;
388 assert(outputStream &&
389 "Compiler instance has no user-specified output stream!");
390 return *outputStream;