diff --git a/flang/include/flang/Frontend/CompilerInstance.h b/flang/include/flang/Frontend/CompilerInstance.h index e37ef5e236871..4ad95c9df42d7 100644 --- a/flang/include/flang/Frontend/CompilerInstance.h +++ b/flang/include/flang/Frontend/CompilerInstance.h @@ -147,6 +147,12 @@ class CompilerInstance { /// @name Semantic analysis /// { + Fortran::semantics::SemanticsContext &createNewSemanticsContext() { + semaContext = + getInvocation().getSemanticsCtx(*allCookedSources, getTargetMachine()); + return *semaContext; + } + Fortran::semantics::SemanticsContext &getSemanticsContext() { return *semaContext; } diff --git a/flang/lib/Frontend/CompilerInstance.cpp b/flang/lib/Frontend/CompilerInstance.cpp index f7ed969f03bf4..cbd2c58eeeb47 100644 --- a/flang/lib/Frontend/CompilerInstance.cpp +++ b/flang/lib/Frontend/CompilerInstance.cpp @@ -162,8 +162,6 @@ bool CompilerInstance::executeAction(FrontendAction &act) { allSources->set_encoding(invoc.getFortranOpts().encoding); if (!setUpTargetMachine()) return false; - // Create the semantics context - semaContext = invoc.getSemanticsCtx(*allCookedSources, getTargetMachine()); // Set options controlling lowering to FIR. invoc.setLoweringOptions(); diff --git a/flang/lib/Frontend/FrontendAction.cpp b/flang/lib/Frontend/FrontendAction.cpp index ab77d143fa4b6..d178fd6a9395d 100644 --- a/flang/lib/Frontend/FrontendAction.cpp +++ b/flang/lib/Frontend/FrontendAction.cpp @@ -183,7 +183,7 @@ bool FrontendAction::runSemanticChecks() { // Transfer any pending non-fatal messages from parsing to semantics // so that they are merged and all printed in order. - auto &semanticsCtx{ci.getSemanticsContext()}; + auto &semanticsCtx{ci.createNewSemanticsContext()}; semanticsCtx.messages().Annex(std::move(ci.getParsing().messages())); semanticsCtx.set_debugModuleWriter(ci.getInvocation().getDebugModuleDir()); diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index c1f47b12abee2..e5a15c555fa5e 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -171,6 +171,10 @@ static void addDependentLibs(mlir::ModuleOp mlirModule, CompilerInstance &ci) { } bool CodeGenAction::beginSourceFileAction() { + // Delete previous LLVM module depending on old context before making a new + // one. + if (llvmModule) + llvmModule.reset(nullptr); llvmCtx = std::make_unique(); CompilerInstance &ci = this->getInstance(); mlir::DefaultTimingManager &timingMgr = ci.getTimingManager(); @@ -197,6 +201,9 @@ bool CodeGenAction::beginSourceFileAction() { return true; } + // Reset MLIR module if it was set before overriding the old context. + if (mlirModule) + mlirModule = mlir::OwningOpRef(nullptr); // Load the MLIR dialects required by Flang mlirCtx = std::make_unique(); fir::support::loadDialects(*mlirCtx); diff --git a/flang/test/Driver/multiple-fc1-input.f90 b/flang/test/Driver/multiple-fc1-input.f90 new file mode 100644 index 0000000000000..57f7c5e92b4c4 --- /dev/null +++ b/flang/test/Driver/multiple-fc1-input.f90 @@ -0,0 +1,9 @@ +! Test that flang -fc1 can be called with several input files without +! crashing. +! Regression tests for: https://github.com/llvm/llvm-project/issues/137126 + +! RUN: %flang_fc1 -emit-fir %s %s -o - | FileCheck %s +subroutine foo() +end subroutine +! CHECK: func @_QPfoo() +! CHECK: func @_QPfoo()