45class CompilerInstance {
48 std::shared_ptr<CompilerInvocation> invocation;
51 std::shared_ptr<Fortran::parser::AllSources> allSources;
53 std::shared_ptr<Fortran::parser::AllCookedSources> allCookedSources;
55 std::shared_ptr<Fortran::parser::Parsing> parsing;
57 std::unique_ptr<Fortran::semantics::Semantics> semantics;
59 std::unique_ptr<Fortran::semantics::RuntimeDerivedTypeTables> rtTyTables;
61 std::unique_ptr<Fortran::semantics::SemanticsContext> semaContext;
64 llvm::cl::LibraryOptionsContext libraryOptions;
66 std::unique_ptr<llvm::TargetMachine> targetMachine;
69 std::vector<std::unique_ptr<llvm::PassPlugin>> passPlugins;
72 llvm::raw_ostream *semaOutputStream = &llvm::errs();
75 std::unique_ptr<llvm::raw_ostream> ownedSemaOutputStream;
78 llvm::IntrusiveRefCntPtr<clang::DiagnosticsEngine> diagnostics;
83 OutputFile(std::string inputFilename)
84 : filename(std::move(inputFilename)) {}
88 std::list<OutputFile> outputFiles;
94 std::unique_ptr<llvm::raw_pwrite_stream> outputStream;
100 mlir::DefaultTimingManager timingMgr;
104 mlir::TimingScope timingScopeRoot;
112 std::unique_ptr<Fortran::support::string_ostream> timingStreamMLIR;
113 std::unique_ptr<Fortran::support::string_ostream> timingStreamLLVM;
114 std::unique_ptr<Fortran::support::string_ostream> timingStreamCodeGen;
119 explicit CompilerInstance(std::shared_ptr<CompilerInvocation> invocation);
135 bool hasAllSources()
const {
return allSources !=
nullptr; }
138 assert(allCookedSources &&
"Compiler instance has no AllCookedSources!");
139 return *allCookedSources;
180 void setSemantics(std::unique_ptr<Fortran::semantics::Semantics> sema) {
181 semantics = std::move(sema);
185 std::unique_ptr<Fortran::semantics::RuntimeDerivedTypeTables> tables) {
186 rtTyTables = std::move(tables);
189 Fortran::semantics::RuntimeDerivedTypeTables &getRtTyTables() {
190 assert(rtTyTables &&
"Missing runtime derived type tables!");
208 clang::DiagnosticOptions &getDiagnosticOpts() {
209 return invocation->getDiagnosticOpts();
211 const clang::DiagnosticOptions &getDiagnosticOpts()
const {
212 return invocation->getDiagnosticOpts();
215 FrontendOptions &getFrontendOpts() {
return invocation->getFrontendOpts(); }
216 const FrontendOptions &getFrontendOpts()
const {
217 return invocation->getFrontendOpts();
220 PreprocessorOptions &preprocessorOpts() {
221 return invocation->getPreprocessorOpts();
223 const PreprocessorOptions &preprocessorOpts()
const {
224 return invocation->getPreprocessorOpts();
231 bool hasDiagnostics()
const {
return diagnostics !=
nullptr; }
235 assert(diagnostics &&
"Compiler instance has no diagnostics!");
239 clang::DiagnosticConsumer &getDiagnosticClient()
const {
240 assert(diagnostics && diagnostics->getClient() &&
241 "Compiler instance has no diagnostic client!");
242 return *diagnostics->getClient();
263 std::unique_ptr<llvm::raw_pwrite_stream>
265 llvm::StringRef extension =
"");
271 void addPassPlugin(std::unique_ptr<llvm::PassPlugin> plugin) {
272 passPlugins.emplace_back(std::move(plugin));
281 return libraryOptions;
284 return libraryOptions;
292 assert(targetMachine &&
"target machine was not set");
293 return *targetMachine;
296 assert(targetMachine &&
"target machine was not set");
297 return *targetMachine;
309 bool isTimingEnabled()
const {
return timingMgr.isEnabled(); }
311 mlir::DefaultTimingManager &getTimingManager() {
return timingMgr; }
312 const mlir::DefaultTimingManager &getTimingManager()
const {
316 mlir::TimingScope &getTimingScopeRoot() {
return timingScopeRoot; }
317 const mlir::TimingScope &getTimingScopeRoot()
const {
318 return timingScopeRoot;
323 assert(timingStreamMLIR &&
"Timing stream for MLIR was not set");
324 return *timingStreamMLIR;
329 assert(timingStreamLLVM &&
"Timing stream for LLVM was not set");
330 return *timingStreamLLVM;
337 assert(timingStreamCodeGen &&
"Timing stream for codegen was not set");
338 return *timingStreamCodeGen;
348 llvm::Expected<std::unique_ptr<llvm::raw_pwrite_stream>>
349 createOutputFileImpl(llvm::StringRef outputPath,
bool binary);
371 static clang::IntrusiveRefCntPtr<clang::DiagnosticsEngine>
373 clang::DiagnosticConsumer *client =
nullptr,
374 bool shouldOwnClient =
true);
376 bool shouldOwnClient =
true);
381 void setOutputStream(std::unique_ptr<llvm::raw_pwrite_stream> outStream) {
382 outputStream = std::move(outStream);
385 bool isOutputStreamNull() {
return (outputStream ==
nullptr); }
388 void writeOutputStream(
const std::string &message) {
389 *outputStream << message;
394 assert(outputStream &&
395 "Compiler instance has no user-specified output stream!");
396 return *outputStream;