[flang-commits] [flang] [flang] Clip circular dependence between implementation modules (PR #85309)

Peter Klausler via flang-commits flang-commits at lists.llvm.org
Thu Mar 14 13:49:35 PDT 2024


https://github.com/klausler created https://github.com/llvm/llvm-project/pull/85309

flang/module/__fortran_type_info.mod uses __fortran_builtins.mod, but it is also implicitly used when compiling __fortran_builtins.f90 (or anything else).  If __fortran_type_info.mod finds an old __fortran_builtins.mod file, compilation can fail while building the new one.

Break the dependence by *not* generating runtime derived type information for __fortran_builtins.f90.

>From 4e02177642f8b9951cb7b4eae3cdad715299c008 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Thu, 14 Mar 2024 13:09:42 -0700
Subject: [PATCH] [flang] Clip circular dependence between implementation
 modules

flang/module/__fortran_type_info.mod uses __fortran_builtins.mod,
but it is also implicitly used when compiling __fortran_builtins.f90
(or anything else).  If __fortran_type_info.mod finds an old
__fortran_builtins.mod file, compilation can fail while building
the new one.

Break the dependence by *not* generating runtime derived type
information for __fortran_builtins.f90.
---
 flang/lib/Semantics/runtime-type-info.cpp | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/flang/lib/Semantics/runtime-type-info.cpp b/flang/lib/Semantics/runtime-type-info.cpp
index 9845a190bc756c..15ea34c66dba52 100644
--- a/flang/lib/Semantics/runtime-type-info.cpp
+++ b/flang/lib/Semantics/runtime-type-info.cpp
@@ -1239,6 +1239,16 @@ void RuntimeTableBuilder::IncorporateDefinedIoGenericInterfaces(
 RuntimeDerivedTypeTables BuildRuntimeDerivedTypeTables(
     SemanticsContext &context) {
   RuntimeDerivedTypeTables result;
+  // Do not attempt to read __fortran_type_info.mod when compiling
+  // the module on which it depends.
+  const auto &allSources{context.allCookedSources().allSources()};
+  if (auto firstProv{allSources.GetFirstFileProvenance()}) {
+    if (const auto *srcFile{allSources.GetSourceFile(firstProv->start())}) {
+      if (srcFile->path().find("__fortran_builtins.f90") != std::string::npos) {
+        return result;
+      }
+    }
+  }
   result.schemata = context.GetBuiltinModule(typeInfoBuiltinModule);
   if (result.schemata) {
     RuntimeTableBuilder builder{context, result};



More information about the flang-commits mailing list