https://github.com/Meinersbur updated https://github.com/llvm/llvm-project/pull/196558
>From 9a2dc9c9ab9db05fba11cd32a9457e89a3804402 Mon Sep 17 00:00:00 2001 From: Michael Kruse <[email protected]> Date: Fri, 8 May 2026 17:12:13 +0200 Subject: [PATCH 1/6] [Flang][Driver] Add per-target search path for modules --- clang/include/clang/Driver/ToolChain.h | 4 ++ clang/lib/Driver/Driver.cpp | 11 ++++ clang/lib/Driver/ToolChain.cpp | 6 ++ clang/lib/Driver/ToolChains/Flang.cpp | 31 ++++++++++ .../flang/Frontend/CompilerInvocation.h | 7 +++ flang/lib/Frontend/CompilerInvocation.cpp | 14 +++++ flang/test/Driver/Inputs/ieee_arithmetic.mod | 1 + flang/test/Driver/Inputs/iso_fortran_env.mod | 1 + .../basictestmoduleone.mod | 0 .../flang/x86_64-unknown-linux-gnu/.keep | 0 .../intrinsic-module-path_per_target.f90 | 56 +++++++++++++++++++ flang/test/Driver/use-module.f90 | 12 ++-- flang/tools/bbc/bbc.cpp | 5 ++ 13 files changed, 142 insertions(+), 6 deletions(-) rename flang/test/Driver/Inputs/{ => module-dir-one}/basictestmoduleone.mod (100%) create mode 100644 flang/test/Driver/Inputs/resource_dir_with_per_target_subdir/finclude/flang/x86_64-unknown-linux-gnu/.keep create mode 100644 flang/test/Driver/intrinsic-module-path_per_target.f90 diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index 8bda212312aee..ff044722369cc 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -560,6 +560,10 @@ class ToolChain { // Returns Triple without the OSs version. llvm::Triple getTripleWithoutOSVersion() const; + /// Returns the target-specific path for Flang's intrinsic modules in the + /// resource directory if it exists. + std::optional<std::string> getDefaultIntrinsicModuleDir() const; + // Returns the target specific runtime path if it exists. std::optional<std::string> getRuntimePath() const; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index b9c072a0a0edb..279dc78309bef 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -6766,6 +6766,17 @@ std::string Driver::GetFilePath(StringRef Name, const ToolChain &TC) const { if (llvm::sys::fs::exists(Twine(P))) return std::string(P); + // With Flang, also look for intrinsic modules + if (IsFlangMode()) { + if (std::optional<std::string> IntrPath = + TC.getDefaultIntrinsicModuleDir()) { + SmallString<128> P(*IntrPath); + llvm::sys::path::append(P, Name); + if (llvm::sys::fs::exists(P)) + return std::string(P); + } + } + SmallString<128> D(Dir); llvm::sys::path::append(D, "..", Name); if (llvm::sys::fs::exists(Twine(D))) diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 996c4ab217c23..522dba348e444 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -1137,6 +1137,12 @@ ToolChain::getTargetSubDirPath(StringRef BaseDir) const { return {}; } +std::optional<std::string> ToolChain::getDefaultIntrinsicModuleDir() const { + SmallString<128> P(D.ResourceDir); + llvm::sys::path::append(P, "finclude", "flang"); + return getTargetSubDirPath(P); +} + std::optional<std::string> ToolChain::getRuntimePath() const { SmallString<128> P(D.ResourceDir); llvm::sys::path::append(P, "lib"); diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index ce503b74295e4..f1204b4142163 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -1179,6 +1179,37 @@ void Flang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-resource-dir"); CmdArgs.push_back(D.ResourceDir.c_str()); + // Default intrinsic module dirs must be added after any user-provided + // -fintrinsic-modules-path to have lower precedence + if (std::optional<std::string> IntrModPath = + TC.getDefaultIntrinsicModuleDir()) { + CmdArgs.push_back("-fintrinsic-modules-path"); + CmdArgs.push_back(Args.MakeArgString(*IntrModPath)); + } + + // Ideally, every target triple has its own set of builtin modules since they + // are compiled with platform-dependent conditionals such as `#if __x86_64__`. + // However, getting the builtin modules for offload targets requires building + // the flang-rt and openmp for those targets as well: + // -DLLVM_RUNTIME_TARGETS=default;amdgcn-amd-amdhsa;nvptx64-nvidia-cuda. + // To reduce friction when build systems have not yet been updated, we also + // add the host's builtin module to the search path (with lower priority), in + // case a module file has not been found for the offload targets itself. + // FIXME: This workaround may mix module files targeting different triples and + // should eventually be removed. + auto &&HostTCs = + C.getOffloadToolChains<clang::driver::OffloadAction ::OFK_Host>(); + for (auto [OKind, HostTC] : llvm::make_range(HostTCs.first, HostTCs.second)) { + if (HostTC == &TC) + continue; + + if (std::optional<std::string> IntrModPath = + HostTC->getDefaultIntrinsicModuleDir()) { + CmdArgs.push_back("-fintrinsic-modules-path"); + CmdArgs.push_back(Args.MakeArgString(*IntrModPath)); + } + } + // Offloading related options addOffloadOptions(C, Inputs, JA, Args, CmdArgs); diff --git a/flang/include/flang/Frontend/CompilerInvocation.h b/flang/include/flang/Frontend/CompilerInvocation.h index d294955af780e..feaee28a53349 100644 --- a/flang/include/flang/Frontend/CompilerInvocation.h +++ b/flang/include/flang/Frontend/CompilerInvocation.h @@ -92,6 +92,10 @@ class CompilerInvocation : public CompilerInvocationBase { // intrinsic of iso_fortran_env. std::string allCompilerInvocOpts; + /// Location of the resource directory containing files specific to this + /// instance/version of Flang. + std::string resourceDir; + /// Semantic options // TODO: Merge with or translate to frontendOpts. We shouldn't need two sets // of options. @@ -177,6 +181,9 @@ class CompilerInvocation : public CompilerInvocationBase { getSemanticsCtx(Fortran::parser::AllCookedSources &allCookedSources, const llvm::TargetMachine &); + std::string &getResourceDir() { return resourceDir; } + const std::string &getResourceDir() const { return resourceDir; } + std::string &getModuleDir() { return moduleDir; } const std::string &getModuleDir() const { return moduleDir; } diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index e7f4762e167fb..4031cab6f6637 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -1629,6 +1629,14 @@ bool CompilerInvocation::createFromArgs( success = false; } + // User-specified or default resource dir + if (const llvm::opt::Arg *a = + args.getLastArg(clang::options::OPT_resource_dir)) + invoc.resourceDir = a->getValue(); + else + invoc.resourceDir = clang::GetResourcesPath( + llvm::sys::fs::getMainExecutable(argv0, nullptr)); + // -flang-experimental-hlfir if (args.hasArg(clang::options::OPT_flang_experimental_hlfir) || args.hasArg(clang::options::OPT_emit_hlfir)) { @@ -1912,6 +1920,12 @@ void CompilerInvocation::setFortranOpts() { preprocessorOptions.searchDirectoriesFromIntrModPath.begin(), preprocessorOptions.searchDirectoriesFromIntrModPath.end()); + // Add the ordered list of -fintrinsic-modules-path + fortranOptions.intrinsicModuleDirectories.insert( + fortranOptions.intrinsicModuleDirectories.end(), + preprocessorOptions.searchDirectoriesFromIntrModPath.begin(), + preprocessorOptions.searchDirectoriesFromIntrModPath.end()); + // Add the default intrinsic module directory fortranOptions.intrinsicModuleDirectories.emplace_back( getIntrinsicDir(getArgv0())); diff --git a/flang/test/Driver/Inputs/ieee_arithmetic.mod b/flang/test/Driver/Inputs/ieee_arithmetic.mod index 30fd57801970b..264ff8d035628 100644 --- a/flang/test/Driver/Inputs/ieee_arithmetic.mod +++ b/flang/test/Driver/Inputs/ieee_arithmetic.mod @@ -1,5 +1,6 @@ ! DUMMY module ! Added for testing purposes. The contents of this file are currently not relevant. +! Using this file will cause an error because of missing checksum module ieee_arithmetic type::ieee_round_type integer(1),private::mode=0_1 diff --git a/flang/test/Driver/Inputs/iso_fortran_env.mod b/flang/test/Driver/Inputs/iso_fortran_env.mod index 689297d52027b..c53375d78dec5 100644 --- a/flang/test/Driver/Inputs/iso_fortran_env.mod +++ b/flang/test/Driver/Inputs/iso_fortran_env.mod @@ -1,5 +1,6 @@ ! DUMMY module ! Added for testing purposes. The contents of this file are currently not relevant. +! Using this file will cause an error because of missing checksum module iso_fortran_env use __fortran_builtins,only:event_type=>__builtin_event_type use __fortran_builtins,only:lock_type=>__builtin_lock_type diff --git a/flang/test/Driver/Inputs/basictestmoduleone.mod b/flang/test/Driver/Inputs/module-dir-one/basictestmoduleone.mod similarity index 100% rename from flang/test/Driver/Inputs/basictestmoduleone.mod rename to flang/test/Driver/Inputs/module-dir-one/basictestmoduleone.mod diff --git a/flang/test/Driver/Inputs/resource_dir_with_per_target_subdir/finclude/flang/x86_64-unknown-linux-gnu/.keep b/flang/test/Driver/Inputs/resource_dir_with_per_target_subdir/finclude/flang/x86_64-unknown-linux-gnu/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/flang/test/Driver/intrinsic-module-path_per_target.f90 b/flang/test/Driver/intrinsic-module-path_per_target.f90 new file mode 100644 index 0000000000000..e065508c41ba6 --- /dev/null +++ b/flang/test/Driver/intrinsic-module-path_per_target.f90 @@ -0,0 +1,56 @@ +! Ensure argument -fintrinsic-modules-path works as expected. + +!----------------------------------------- +! FLANG DRIVER +!----------------------------------------- +! NOTE: Depending on how Flang is built, the default intrinsics may have higher +! or lower priority than -fintrinsic-modules-path added here. Using +! basictestmoduleone.mod from Inputs/module-dir/ will trigger an error. + +! RUN: %flang -fsyntax-only -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -### 2>&1 | FileCheck %s --check-prefix=DEFAULTPATH + +! RUN: %flang -fsyntax-only -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_DEFAULT +! RUN: not %flang -fsyntax-only -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_INPUTONE 2>&1 | FileCheck %s --check-prefix=NOINPUTONE +! RUN: not %flang -fsyntax-only -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_INPUTTWO 2>&1 | FileCheck %s --check-prefix=NOINPUTTWO +! RUN: %flang -fsyntax-only -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir/ +! RUN: %flang -fsyntax-only -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_INPUTONE -fintrinsic-modules-path=%S/Inputs/module-dir-one/ +! RUN: %flang -fsyntax-only -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_INPUTONE -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir-one/ -fintrinsic-modules-path=%S/Inputs/module-dir/ +! RUN: not %flang -fsyntax-only -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_INPUTONE -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir/ -fintrinsic-modules-path=%S/Inputs/module-dir-one/ 2>&1 | FileCheck %s --check-prefix=WRONGINPUTONE + + +!----------------------------------------- +! FLANG FRONTEND (flang -fc1) +!----------------------------------------- +! NOTE: %flang_cc1 the default intrinsics path always has higher priority than +! -fintrinsic-modules-path added here. Accidentally using +! ieee_arithmetic/iso_fortran_env from the Inputs/ directory will trigger +! an error (e.g. when the default intrinsics dir is empty). +! Requires the intrinsic modules to be available. + +! RUN: %flang_fc1 -fsyntax-only -cpp %s -DINTRINSICS_DEFAULT +! RUN: not %flang_fc1 -fsyntax-only -cpp %s -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTONE 2>&1 | FileCheck %s --check-prefix=NOINPUTONE +! RUN: not %flang_fc1 -fsyntax-only -cpp %s -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTTWO 2>&1 | FileCheck %s --check-prefix=NOINPUTTWO +! RUN: %flang_fc1 -fsyntax-only -cpp %s -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir/ +! RUN: %flang_fc1 -fsyntax-only -cpp %s -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTONE -fintrinsic-modules-path=%S/Inputs/module-dir-one/ +! RUN: %flang_fc1 -fsyntax-only -cpp %s -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTONE -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir-one/ -fintrinsic-modules-path=%S/Inputs/module-dir/ +! RUN: not %flang_fc1 -fsyntax-only -cpp %s -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTONE -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir -fintrinsic-modules-path=%S/Inputs/module-dir-one/ 2>&1 | FileCheck %s --check-prefix=WRONGINPUTONE + + +! DEFAULTPATH: flang{{.*}}-fc1{{.*}}-fintrinsic-modules-path + +! NOINPUTONE: Source file 'basictestmoduleone.mod' was not found +! NOINPUTTWO: Source file 'basictestmoduletwo.mod' was not found +! WRONGINPUTONE: 't1' not found in module 'basictestmoduleone' + +program test_intrinsic_module_path +#ifdef INTRINSICS_DEFAULT + use ieee_arithmetic, only: ieee_round_type + use iso_fortran_env, only: team_type, event_type, lock_type +#endif +#ifdef INTRINSICS_INPUTONE + use basictestmoduleone, only: t1 +#endif +#ifdef INTRINSICS_INPUTTWO + use basictestmoduletwo, only: t2 +#endif +end program diff --git a/flang/test/Driver/use-module.f90 b/flang/test/Driver/use-module.f90 index ec650475f0b02..18ad63d2ed30f 100644 --- a/flang/test/Driver/use-module.f90 +++ b/flang/test/Driver/use-module.f90 @@ -3,9 +3,9 @@ !-------------------------- ! FLANG DRIVER (flang) !-------------------------- -! RUN: %flang -fsyntax-only -I %S/Inputs -I %S/Inputs/module-dir %s 2>&1 | FileCheck %s --check-prefix=INCLUDED --allow-empty -! RUN: %flang -fsyntax-only -I %S/Inputs -J %S/Inputs/module-dir %s 2>&1 | FileCheck %s --check-prefix=INCLUDED --allow-empty -! RUN: %flang -fsyntax-only -I %S/Inputs -module-dir %S/Inputs/module-dir %s 2>&1 | FileCheck %s --check-prefix=INCLUDED --allow-empty +! RUN: %flang -fsyntax-only -I %S/Inputs/module-dir-one -I %S/Inputs/module-dir %s 2>&1 | FileCheck %s --check-prefix=INCLUDED --allow-empty +! RUN: %flang -fsyntax-only -I %S/Inputs/module-dir-one -J %S/Inputs/module-dir %s 2>&1 | FileCheck %s --check-prefix=INCLUDED --allow-empty +! RUN: %flang -fsyntax-only -I %S/Inputs/module-dir-one -module-dir %S/Inputs/module-dir %s 2>&1 | FileCheck %s --check-prefix=INCLUDED --allow-empty ! RUN: not %flang -fsyntax-only -I %S/Inputs %s 2>&1 | FileCheck %s --check-prefix=MISSING_MOD2 ! RUN: not %flang -fsyntax-only -J %S/Inputs %s 2>&1 | FileCheck %s --check-prefix=MISSING_MOD2 @@ -18,9 +18,9 @@ !----------------------------------------- ! FRONTEND FLANG DRIVER (flang -fc1) !----------------------------------------- -! RUN: %flang_fc1 -fsyntax-only -I %S/Inputs -I %S/Inputs/module-dir %s 2>&1 | FileCheck %s --check-prefix=INCLUDED --allow-empty -! RUN: %flang_fc1 -fsyntax-only -I %S/Inputs -J %S/Inputs/module-dir %s 2>&1 | FileCheck %s --check-prefix=INCLUDED --allow-empty -! RUN: %flang_fc1 -fsyntax-only -I %S/Inputs -module-dir %S/Inputs/module-dir %s 2>&1 | FileCheck %s --check-prefix=INCLUDED --allow-empty +! RUN: %flang_fc1 -fsyntax-only -I %S/Inputs/module-dir-one -I %S/Inputs/module-dir %s 2>&1 | FileCheck %s --check-prefix=INCLUDED --allow-empty +! RUN: %flang_fc1 -fsyntax-only -I %S/Inputs/module-dir-one -J %S/Inputs/module-dir %s 2>&1 | FileCheck %s --check-prefix=INCLUDED --allow-empty +! RUN: %flang_fc1 -fsyntax-only -I %S/Inputs/module-dir-one -module-dir %S/Inputs/module-dir %s 2>&1 | FileCheck %s --check-prefix=INCLUDED --allow-empty ! RUN: not %flang_fc1 -fsyntax-only -I %S/Inputs %s 2>&1 | FileCheck %s --check-prefix=MISSING_MOD2 ! RUN: not %flang_fc1 -fsyntax-only -J %S/Inputs %s 2>&1 | FileCheck %s --check-prefix=MISSING_MOD2 diff --git a/flang/tools/bbc/bbc.cpp b/flang/tools/bbc/bbc.cpp index a21865f9c5ffe..227f09a4d0367 100644 --- a/flang/tools/bbc/bbc.cpp +++ b/flang/tools/bbc/bbc.cpp @@ -100,6 +100,11 @@ static llvm::cl::alias llvm::cl::desc("intrinsic module directory"), llvm::cl::aliasopt(intrinsicIncludeDirs)); +static llvm::cl::alias + intrinsicModulePath("fintrinsic-modules-path", + llvm::cl::desc("intrinsic module search paths"), + llvm::cl::aliasopt(intrinsicIncludeDirs)); + static llvm::cl::opt<std::string> moduleDir("module", llvm::cl::desc("module output directory (default .)"), llvm::cl::init(".")); >From de6e49b5f3e339afff4ed8825eeb2503dbba2ee4 Mon Sep 17 00:00:00 2001 From: Michael Kruse <[email protected]> Date: Fri, 8 May 2026 19:09:31 +0200 Subject: [PATCH 2/6] resource dir not needed in frontend Driver passes on -resource-dir anyway --- flang/include/flang/Frontend/CompilerInvocation.h | 7 ------- flang/lib/Frontend/CompilerInvocation.cpp | 8 -------- 2 files changed, 15 deletions(-) diff --git a/flang/include/flang/Frontend/CompilerInvocation.h b/flang/include/flang/Frontend/CompilerInvocation.h index feaee28a53349..d294955af780e 100644 --- a/flang/include/flang/Frontend/CompilerInvocation.h +++ b/flang/include/flang/Frontend/CompilerInvocation.h @@ -92,10 +92,6 @@ class CompilerInvocation : public CompilerInvocationBase { // intrinsic of iso_fortran_env. std::string allCompilerInvocOpts; - /// Location of the resource directory containing files specific to this - /// instance/version of Flang. - std::string resourceDir; - /// Semantic options // TODO: Merge with or translate to frontendOpts. We shouldn't need two sets // of options. @@ -181,9 +177,6 @@ class CompilerInvocation : public CompilerInvocationBase { getSemanticsCtx(Fortran::parser::AllCookedSources &allCookedSources, const llvm::TargetMachine &); - std::string &getResourceDir() { return resourceDir; } - const std::string &getResourceDir() const { return resourceDir; } - std::string &getModuleDir() { return moduleDir; } const std::string &getModuleDir() const { return moduleDir; } diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 4031cab6f6637..a441e73dbb6f3 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -1629,14 +1629,6 @@ bool CompilerInvocation::createFromArgs( success = false; } - // User-specified or default resource dir - if (const llvm::opt::Arg *a = - args.getLastArg(clang::options::OPT_resource_dir)) - invoc.resourceDir = a->getValue(); - else - invoc.resourceDir = clang::GetResourcesPath( - llvm::sys::fs::getMainExecutable(argv0, nullptr)); - // -flang-experimental-hlfir if (args.hasArg(clang::options::OPT_flang_experimental_hlfir) || args.hasArg(clang::options::OPT_emit_hlfir)) { >From 7175d46c7b9c8e66276f7cbd0a9974fd7a81fc88 Mon Sep 17 00:00:00 2001 From: Michael Kruse <[email protected]> Date: Fri, 8 May 2026 22:12:38 +0200 Subject: [PATCH 3/6] Specify target triple --- .../intrinsic-module-path_per_target.f90 | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/flang/test/Driver/intrinsic-module-path_per_target.f90 b/flang/test/Driver/intrinsic-module-path_per_target.f90 index e065508c41ba6..127af2bf9aed6 100644 --- a/flang/test/Driver/intrinsic-module-path_per_target.f90 +++ b/flang/test/Driver/intrinsic-module-path_per_target.f90 @@ -7,15 +7,15 @@ ! or lower priority than -fintrinsic-modules-path added here. Using ! basictestmoduleone.mod from Inputs/module-dir/ will trigger an error. -! RUN: %flang -fsyntax-only -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -### 2>&1 | FileCheck %s --check-prefix=DEFAULTPATH - -! RUN: %flang -fsyntax-only -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_DEFAULT -! RUN: not %flang -fsyntax-only -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_INPUTONE 2>&1 | FileCheck %s --check-prefix=NOINPUTONE -! RUN: not %flang -fsyntax-only -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_INPUTTWO 2>&1 | FileCheck %s --check-prefix=NOINPUTTWO -! RUN: %flang -fsyntax-only -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir/ -! RUN: %flang -fsyntax-only -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_INPUTONE -fintrinsic-modules-path=%S/Inputs/module-dir-one/ -! RUN: %flang -fsyntax-only -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_INPUTONE -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir-one/ -fintrinsic-modules-path=%S/Inputs/module-dir/ -! RUN: not %flang -fsyntax-only -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_INPUTONE -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir/ -fintrinsic-modules-path=%S/Inputs/module-dir-one/ 2>&1 | FileCheck %s --check-prefix=WRONGINPUTONE +! RUN: %flang -fsyntax-only --target=x86_64-unknown-linux-gnu -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -### 2>&1 | FileCheck %s --check-prefix=DEFAULTPATH + +! RUN: %flang -fsyntax-only --target=x86_64-unknown-linux-gnu -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_DEFAULT +! RUN: not %flang -fsyntax-only --target=x86_64-unknown-linux-gnu -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_INPUTONE 2>&1 | FileCheck %s --check-prefix=NOINPUTONE +! RUN: not %flang -fsyntax-only --target=x86_64-unknown-linux-gnu -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_INPUTTWO 2>&1 | FileCheck %s --check-prefix=NOINPUTTWO +! RUN: %flang -fsyntax-only --target=x86_64-unknown-linux-gnu -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir/ +! RUN: %flang -fsyntax-only --target=x86_64-unknown-linux-gnu -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_INPUTONE -fintrinsic-modules-path=%S/Inputs/module-dir-one/ +! RUN: %flang -fsyntax-only --target=x86_64-unknown-linux-gnu -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_INPUTONE -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir-one/ -fintrinsic-modules-path=%S/Inputs/module-dir/ +! RUN: not %flang -fsyntax-only --target=x86_64-unknown-linux-gnu -resource-dir %S/Inputs/resource_dir_with_per_target_subdir %s -cpp -DINTRINSICS_INPUTONE -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir/ -fintrinsic-modules-path=%S/Inputs/module-dir-one/ 2>&1 | FileCheck %s --check-prefix=WRONGINPUTONE !----------------------------------------- >From 8e350bc1dacfeae4c521dcd5b7a9b96b43018f7f Mon Sep 17 00:00:00 2001 From: Michael Kruse <[email protected]> Date: Fri, 8 May 2026 22:24:13 +0200 Subject: [PATCH 4/6] Add bbc test --- flang/test/Driver/intrinsic-module-path_bbc.f90 | 12 ++++++++++++ .../test/Driver/intrinsic-module-path_per_target.f90 | 4 +++- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 flang/test/Driver/intrinsic-module-path_bbc.f90 diff --git a/flang/test/Driver/intrinsic-module-path_bbc.f90 b/flang/test/Driver/intrinsic-module-path_bbc.f90 new file mode 100644 index 0000000000000..ad41e69b9fec0 --- /dev/null +++ b/flang/test/Driver/intrinsic-module-path_bbc.f90 @@ -0,0 +1,12 @@ +! Ensure argument -fintrinsic-modules-path works as expected. + +! RUN: not bbc %s -fintrinsic-modules-path=%S/Inputs/module-dir/ -fintrinsic-modules-path=%S/Inputs/module-dir-one/ 2>&1 | FileCheck %s --check-prefix=WRONGINPUTONE + +! WRONGINPUTONE: 't1' not found in module 'basictestmoduleone' + +program test_intrinsic_module_path + use ieee_arithmetic, only: ieee_round_type + use iso_fortran_env, only: team_type, event_type, lock_type + use basictestmoduleone, only: t1 + use basictestmoduletwo, only: t2 +end program diff --git a/flang/test/Driver/intrinsic-module-path_per_target.f90 b/flang/test/Driver/intrinsic-module-path_per_target.f90 index 127af2bf9aed6..c1be71bff269f 100644 --- a/flang/test/Driver/intrinsic-module-path_per_target.f90 +++ b/flang/test/Driver/intrinsic-module-path_per_target.f90 @@ -33,9 +33,11 @@ ! RUN: %flang_fc1 -fsyntax-only -cpp %s -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir/ ! RUN: %flang_fc1 -fsyntax-only -cpp %s -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTONE -fintrinsic-modules-path=%S/Inputs/module-dir-one/ ! RUN: %flang_fc1 -fsyntax-only -cpp %s -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTONE -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir-one/ -fintrinsic-modules-path=%S/Inputs/module-dir/ -! RUN: not %flang_fc1 -fsyntax-only -cpp %s -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTONE -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir -fintrinsic-modules-path=%S/Inputs/module-dir-one/ 2>&1 | FileCheck %s --check-prefix=WRONGINPUTONE +! RUN: not %flang_fc1 -fsyntax-only -cpp %s -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTONE -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir/ -fintrinsic-modules-path=%S/Inputs/module-dir-one/ 2>&1 | FileCheck %s --check-prefix=WRONGINPUTONE +!----------------------------------------- + ! DEFAULTPATH: flang{{.*}}-fc1{{.*}}-fintrinsic-modules-path ! NOINPUTONE: Source file 'basictestmoduleone.mod' was not found >From 0b60113361a94e25c9df2b2021510ca30ad9ae1f Mon Sep 17 00:00:00 2001 From: Michael Kruse <[email protected]> Date: Fri, 8 May 2026 22:27:01 +0200 Subject: [PATCH 5/6] Outstract bbc changes --- flang/test/Driver/intrinsic-module-path_bbc.f90 | 12 ------------ flang/tools/bbc/bbc.cpp | 5 ----- 2 files changed, 17 deletions(-) delete mode 100644 flang/test/Driver/intrinsic-module-path_bbc.f90 diff --git a/flang/test/Driver/intrinsic-module-path_bbc.f90 b/flang/test/Driver/intrinsic-module-path_bbc.f90 deleted file mode 100644 index ad41e69b9fec0..0000000000000 --- a/flang/test/Driver/intrinsic-module-path_bbc.f90 +++ /dev/null @@ -1,12 +0,0 @@ -! Ensure argument -fintrinsic-modules-path works as expected. - -! RUN: not bbc %s -fintrinsic-modules-path=%S/Inputs/module-dir/ -fintrinsic-modules-path=%S/Inputs/module-dir-one/ 2>&1 | FileCheck %s --check-prefix=WRONGINPUTONE - -! WRONGINPUTONE: 't1' not found in module 'basictestmoduleone' - -program test_intrinsic_module_path - use ieee_arithmetic, only: ieee_round_type - use iso_fortran_env, only: team_type, event_type, lock_type - use basictestmoduleone, only: t1 - use basictestmoduletwo, only: t2 -end program diff --git a/flang/tools/bbc/bbc.cpp b/flang/tools/bbc/bbc.cpp index 227f09a4d0367..a21865f9c5ffe 100644 --- a/flang/tools/bbc/bbc.cpp +++ b/flang/tools/bbc/bbc.cpp @@ -100,11 +100,6 @@ static llvm::cl::alias llvm::cl::desc("intrinsic module directory"), llvm::cl::aliasopt(intrinsicIncludeDirs)); -static llvm::cl::alias - intrinsicModulePath("fintrinsic-modules-path", - llvm::cl::desc("intrinsic module search paths"), - llvm::cl::aliasopt(intrinsicIncludeDirs)); - static llvm::cl::opt<std::string> moduleDir("module", llvm::cl::desc("module output directory (default .)"), llvm::cl::init(".")); >From 24f4ff604cb6992760c7af1eadd2db4964f1e858 Mon Sep 17 00:00:00 2001 From: Michael Kruse <[email protected]> Date: Wed, 13 May 2026 15:45:58 +0200 Subject: [PATCH 6/6] Update clang/lib/Driver/ToolChains/Flang.cpp Co-authored-by: Tarun Prabhu <[email protected]> --- clang/lib/Driver/ToolChains/Flang.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index f1204b4142163..c9c6721b1e2f6 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -1179,8 +1179,9 @@ void Flang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-resource-dir"); CmdArgs.push_back(D.ResourceDir.c_str()); - // Default intrinsic module dirs must be added after any user-provided - // -fintrinsic-modules-path to have lower precedence + // Default intrinsic module dirs must be added after any user-provided dirs in + // -fintrinsic-modules-path since the default dirs have lower precedence than + // user-provided dirs if (std::optional<std::string> IntrModPath = TC.getDefaultIntrinsicModuleDir()) { CmdArgs.push_back("-fintrinsic-modules-path"); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
