https://github.com/kaviya2510 updated https://github.com/llvm/llvm-project/pull/216643
>From ffa8b2b806f3a4d4369c56237789dc0c1d50949e Mon Sep 17 00:00:00 2001 From: Kaviya Rajendiran <[email protected]> Date: Mon, 17 Aug 2026 11:36:26 +0530 Subject: [PATCH 1/2] [FLANG][Driver] Support -fno-profile-generate and -fprofile-generate=<dir> in flang --- clang/include/clang/Options/Options.td | 4 ++-- clang/lib/Driver/ToolChains/Flang.cpp | 12 +++++++++--- flang/lib/Frontend/CompilerInvocation.cpp | 14 ++++++++++++-- flang/test/Driver/flang-f-opts.f90 | 12 ++++++++++++ flang/test/Profile/gcc-flag-compatibility.f90 | 6 ++++++ 5 files changed, 41 insertions(+), 7 deletions(-) diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index adc4224dd561c..b1c188d6452f3 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -1954,7 +1954,7 @@ def fprofile_generate : Flag<["-"], "fprofile-generate">, Group<f_Group>, Visibility<[ClangOption, CLOption, FlangOption, FC1Option]>, HelpText<"Generate instrumented code to collect execution counts into default.profraw (overridden by LLVM_PROFILE_FILE env var)">; def fprofile_generate_EQ : Joined<["-"], "fprofile-generate=">, - Group<f_Group>, Visibility<[ClangOption, CLOption]>, + Group<f_Group>, Visibility<[ClangOption, CLOption, FlangOption, FC1Option]>, MetaVarName<"<directory>">, HelpText<"Generate instrumented code to collect execution counts into <directory>/default.profraw (overridden by LLVM_PROFILE_FILE env var)">; def fcs_profile_generate : Flag<["-"], "fcs-profile-generate">, @@ -1975,7 +1975,7 @@ def fno_profile_instr_generate : Flag<["-"], "fno-profile-instr-generate">, Group<f_Group>, Visibility<[ClangOption, CLOption]>, HelpText<"Disable generation of profile instrumentation.">; def fno_profile_generate : Flag<["-"], "fno-profile-generate">, - Group<f_Group>, Visibility<[ClangOption, CLOption]>, + Group<f_Group>, Visibility<[ClangOption, CLOption, FlangOption, FC1Option]>, HelpText<"Disable generation of profile instrumentation.">; def fno_profile_instr_use : Flag<["-"], "fno-profile-instr-use">, Group<f_Group>, Visibility<[ClangOption, CLOption]>, diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index a48e41159f367..d0545b57bb7fe 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -1233,6 +1233,13 @@ static void addPGOAndCoverageFlags(const ToolChain &TC, const JobAction &JA, if (Args.hasFlag(options::OPT_fpseudo_probe_for_profiling, options::OPT_fno_pseudo_probe_for_profiling, false)) CmdArgs.push_back("-fpseudo-probe-for-profiling"); + + if (Arg *PGOGenerateArg = Args.getLastArg( + options::OPT_fprofile_generate, options::OPT_fprofile_generate_EQ, + options::OPT_fno_profile_generate)) { + if (!PGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate)) + PGOGenerateArg->render(Args, CmdArgs); + } } void Flang::ConstructJob(Compilation &C, const JobAction &JA, @@ -1365,9 +1372,8 @@ void Flang::ConstructJob(Compilation &C, const JobAction &JA, // TODO: Handle interactions between -w, -pedantic, -Wall, -WOption Args.AddLastArg(CmdArgs, options::OPT_w); - // recognise options: fprofile-generate -fprofile-use= - Args.addAllArgs( - CmdArgs, {options::OPT_fprofile_generate, options::OPT_fprofile_use_EQ}); + // recognise options: -fprofile-use= + Args.addAllArgs(CmdArgs, {options::OPT_fprofile_use_EQ}); addPGOAndCoverageFlags(TC, JA, Args, CmdArgs); diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index b57bc4583be38..7753265ae413c 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -497,8 +497,18 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts, opts.IsPIE = 1; } - if (args.hasArg(clang::options::OPT_fprofile_generate)) { - opts.setProfileInstr(llvm::driver::ProfileInstrKind::ProfileIRInstr); + if (const llvm::opt::Arg *a = + args.getLastArg(clang::options::OPT_fprofile_generate, + clang::options::OPT_fprofile_generate_EQ, + clang::options::OPT_fno_profile_generate)) { + if (!a->getOption().matches(clang::options::OPT_fno_profile_generate)) { + opts.setProfileInstr(llvm::driver::ProfileInstrKind::ProfileIRInstr); + if (a->getOption().matches(clang::options::OPT_fprofile_generate_EQ)) { + llvm::SmallString<128> path(a->getValue()); + llvm::sys::path::append(path, "default_%m.profraw"); + opts.InstrProfileOutput = std::string(path); + } + } } if (auto A = args.getLastArg(clang::options::OPT_fprofile_use_EQ)) { diff --git a/flang/test/Driver/flang-f-opts.f90 b/flang/test/Driver/flang-f-opts.f90 index 3f53adaf56271..def17a7b15ecf 100644 --- a/flang/test/Driver/flang-f-opts.f90 +++ b/flang/test/Driver/flang-f-opts.f90 @@ -11,6 +11,18 @@ ! RUN: %flang -### -S -fprofile-generate %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-GENERATE-LLVM %s ! CHECK-PROFILE-GENERATE-LLVM: "-fprofile-generate" + +! RUN: rm -rf %t.pgodir && mkdir -p %t.pgodir +! RUN: %flang -### -S -fprofile-generate=%t.pgodir %s 2>&1| FileCheck -check-prefix=CHECK-PROFILE-GENERATE-EQ %s +! CHECK-PROFILE-GENERATE-EQ: "-fprofile-generate={{.*}}pgodir" + +! RUN: %flang -### -S -fprofile-generate -fno-profile-generate %s 2>&1 | FileCheck -check-prefix=CHECK-FNO-PROFILE-GENERATE %s +! CHECK-FNO-PROFILE-GENERATE: "-fc1" +! CHECK-FNO-PROFILE-GENERATE-NOT: "-fprofile-generate" + +! RUN: %flang -### -S -fno-profile-generate -fprofile-generate %s 2>&1 | FileCheck -check-prefix=CHECK-FPROFILE-GENERATE %s +! CHECK-FPROFILE-GENERATE: "-fprofile-generate" + ! RUN: %flang -### -S -fprofile-use=%S %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-USE-DIR %s ! CHECK-PROFILE-USE-DIR: "-fprofile-use={{.*}}" ! diff --git a/flang/test/Profile/gcc-flag-compatibility.f90 b/flang/test/Profile/gcc-flag-compatibility.f90 index 4490c45232d28..5040cc6b721bf 100644 --- a/flang/test/Profile/gcc-flag-compatibility.f90 +++ b/flang/test/Profile/gcc-flag-compatibility.f90 @@ -6,6 +6,12 @@ ! On AIX, -flto used to be required with -fprofile-generate. gcc-flag-compatibility-aix.c is used to do the testing on AIX with -flto ! RUN: %flang %s -c -S -o - -emit-llvm -fprofile-generate | FileCheck -check-prefix=PROFILE-GEN %s +! RUN: rm -rf %t.gendir +! RUN: mkdir -p %t.gendir +! RUN: %flang %s -c -S -o - -emit-llvm -fprofile-generate=%t.gendir | FileCheck -check-prefix=PROFILE-GEN %s +! RUN: %flang_fc1 -emit-llvm -fprofile-generate -fno-profile-generate -o - %s | FileCheck -check-prefix=NO-PROFILE-GEN %s +! RUN: %flang_fc1 -emit-llvm -fno-profile-generate -fprofile-generate -o - %s | FileCheck -check-prefix=PROFILE-GEN %s +! NO-PROFILE-GEN-NOT: @__profc_ ! PROFILE-GEN: @__profc_{{_?}}main = {{(private|internal)}} global [1 x i64] zeroinitializer, section ! PROFILE-GEN: @__profd_{{_?}}main = >From fbc4a2d6ea64c34db68d22b9b8ad6ca298cd9ea4 Mon Sep 17 00:00:00 2001 From: Kaviya Rajendiran <[email protected]> Date: Wed, 19 Aug 2026 13:18:48 +0530 Subject: [PATCH 2/2] [Flang][Driver] Modified the visibility of '-fno-profile-generate' option --- clang/include/clang/Options/Options.td | 2 +- flang/lib/Frontend/CompilerInvocation.cpp | 15 ++++++--------- flang/test/Profile/gcc-flag-compatibility.f90 | 3 --- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index b1c188d6452f3..66f4b7e4b012e 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -1975,7 +1975,7 @@ def fno_profile_instr_generate : Flag<["-"], "fno-profile-instr-generate">, Group<f_Group>, Visibility<[ClangOption, CLOption]>, HelpText<"Disable generation of profile instrumentation.">; def fno_profile_generate : Flag<["-"], "fno-profile-generate">, - Group<f_Group>, Visibility<[ClangOption, CLOption, FlangOption, FC1Option]>, + Group<f_Group>, Visibility<[ClangOption, CLOption, FlangOption]>, HelpText<"Disable generation of profile instrumentation.">; def fno_profile_instr_use : Flag<["-"], "fno-profile-instr-use">, Group<f_Group>, Visibility<[ClangOption, CLOption]>, diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 7753265ae413c..b5e91353ed9eb 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -499,15 +499,12 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts, if (const llvm::opt::Arg *a = args.getLastArg(clang::options::OPT_fprofile_generate, - clang::options::OPT_fprofile_generate_EQ, - clang::options::OPT_fno_profile_generate)) { - if (!a->getOption().matches(clang::options::OPT_fno_profile_generate)) { - opts.setProfileInstr(llvm::driver::ProfileInstrKind::ProfileIRInstr); - if (a->getOption().matches(clang::options::OPT_fprofile_generate_EQ)) { - llvm::SmallString<128> path(a->getValue()); - llvm::sys::path::append(path, "default_%m.profraw"); - opts.InstrProfileOutput = std::string(path); - } + clang::options::OPT_fprofile_generate_EQ)) { + opts.setProfileInstr(llvm::driver::ProfileInstrKind::ProfileIRInstr); + if (a->getOption().matches(clang::options::OPT_fprofile_generate_EQ)) { + llvm::SmallString<128> path(a->getValue()); + llvm::sys::path::append(path, "default_%m.profraw"); + opts.InstrProfileOutput = std::string(path); } } diff --git a/flang/test/Profile/gcc-flag-compatibility.f90 b/flang/test/Profile/gcc-flag-compatibility.f90 index 5040cc6b721bf..ae46ed65a40e3 100644 --- a/flang/test/Profile/gcc-flag-compatibility.f90 +++ b/flang/test/Profile/gcc-flag-compatibility.f90 @@ -9,9 +9,6 @@ ! RUN: rm -rf %t.gendir ! RUN: mkdir -p %t.gendir ! RUN: %flang %s -c -S -o - -emit-llvm -fprofile-generate=%t.gendir | FileCheck -check-prefix=PROFILE-GEN %s -! RUN: %flang_fc1 -emit-llvm -fprofile-generate -fno-profile-generate -o - %s | FileCheck -check-prefix=NO-PROFILE-GEN %s -! RUN: %flang_fc1 -emit-llvm -fno-profile-generate -fprofile-generate -o - %s | FileCheck -check-prefix=PROFILE-GEN %s -! NO-PROFILE-GEN-NOT: @__profc_ ! PROFILE-GEN: @__profc_{{_?}}main = {{(private|internal)}} global [1 x i64] zeroinitializer, section ! PROFILE-GEN: @__profd_{{_?}}main = _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
