https://github.com/kaviya2510 updated 
https://github.com/llvm/llvm-project/pull/216643

>From 5e569d9e3eedad31bf86a3c78fda4baed2c80a87 Mon Sep 17 00:00:00 2001
From: Kaviya Rajendiran <[email protected]>
Date: Mon, 17 Aug 2026 11:36:26 +0530
Subject: [PATCH 1/3] [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 a40540691a254..4114f60025f99 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 501c5ada7242989374bcea79554b379506528a39 Mon Sep 17 00:00:00 2001
From: Kaviya Rajendiran <[email protected]>
Date: Wed, 19 Aug 2026 13:18:48 +0530
Subject: [PATCH 2/3] [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 =
 

>From 2cfdd342b0c27fddab51fa665e7199d15792d58c Mon Sep 17 00:00:00 2001
From: Kaviya Rajendiran <[email protected]>
Date: Wed, 19 Aug 2026 22:58:44 +0530
Subject: [PATCH 3/3] [Flang][Driver] Addressed NIT comments

---
 clang/lib/Driver/ToolChains/Flang.cpp         |  5 ++---
 flang/test/Driver/flang-f-opts.f90            | 14 +++++++-------
 flang/test/Profile/gcc-flag-compatibility.f90 |  8 ++++----
 3 files changed, 13 insertions(+), 14 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/Flang.cpp 
b/clang/lib/Driver/ToolChains/Flang.cpp
index 4114f60025f99..dbad87437b1b8 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -1240,6 +1240,8 @@ static void addPGOAndCoverageFlags(const ToolChain &TC, 
const JobAction &JA,
     if 
(!PGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
       PGOGenerateArg->render(Args, CmdArgs);
   }
+
+  Args.addAllArgs(CmdArgs, {options::OPT_fprofile_use_EQ});
 }
 
 void Flang::ConstructJob(Compilation &C, const JobAction &JA,
@@ -1372,9 +1374,6 @@ 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-use=
-  Args.addAllArgs(CmdArgs, {options::OPT_fprofile_use_EQ});
-
   addPGOAndCoverageFlags(TC, JA, Args, CmdArgs);
 
   // Forward flags for OpenMP. We don't do this if the current action is an
diff --git a/flang/test/Driver/flang-f-opts.f90 
b/flang/test/Driver/flang-f-opts.f90
index def17a7b15ecf..a082545206ea3 100644
--- a/flang/test/Driver/flang-f-opts.f90
+++ b/flang/test/Driver/flang-f-opts.f90
@@ -13,15 +13,15 @@
 ! 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 -### -fprofile-generate=%t.pgodir %s 2>&1| FileCheck 
-check-prefix=PROFILE-GENERATE-EQ %s
+! 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 -### -fprofile-generate -fno-profile-generate %s 2>&1 | 
FileCheck -check-prefix=NO-PROFILE-GENERATE %s
+! NO-PROFILE-GENERATE: "-fc1"
+! NO-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 -### -fno-profile-generate -fprofile-generate %s 2>&1 | 
FileCheck -check-prefix=PROFILE-GENERATE %s
+! PROFILE-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 ae46ed65a40e3..c7847db2f154e 100644
--- a/flang/test/Profile/gcc-flag-compatibility.f90
+++ b/flang/test/Profile/gcc-flag-compatibility.f90
@@ -5,10 +5,10 @@
 ! -fprofile-use=<dir>/file   Uses the profile file <dir>/file
 
 ! 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: %flang %s -S -emit-llvm -o - -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 %s -S -emit-llvm -fprofile-generate=%t.gendir -o - | FileCheck 
-check-prefix=PROFILE-GEN %s
 ! PROFILE-GEN: @__profc_{{_?}}main = {{(private|internal)}} global [1 x i64] 
zeroinitializer, section
 ! PROFILE-GEN: @__profd_{{_?}}main =
 
@@ -17,9 +17,9 @@
 ! RUN: rm -rf %t.dir
 ! RUN: mkdir -p %t.dir/some/path
 ! RUN: llvm-profdata merge %S/Inputs/gcc-flag-compatibility_IR.proftext -o 
%t.dir/some/path/file.prof
-! RUN: %flang %s -o - -emit-llvm -S -fprofile-use=%t.dir/some/path/file.prof | 
FileCheck -check-prefix=PROFILE-USE-IR1 %s
+! RUN: %flang %s -S -emit-llvm -fprofile-use=%t.dir/some/path/file.prof -o - | 
FileCheck -check-prefix=PROFILE-USE-IR1 %s
 ! RUN: llvm-profdata merge %S/Inputs/gcc-flag-compatibility_IR_entry.proftext 
-o %t.dir/some/path/file.prof
-! RUN: %flang %s -o - -emit-llvm -S -fprofile-use=%t.dir/some/path/file.prof | 
FileCheck -check-prefix=PROFILE-USE-IR2 %s
+! RUN: %flang %s -S -emit-llvm -fprofile-use=%t.dir/some/path/file.prof -o - | 
FileCheck -check-prefix=PROFILE-USE-IR2 %s
 ! PROFILE-USE-IR1: = !{!"branch_weights", i32 100, i32 1}
 ! PROFILE-USE-IR2: = !{!"branch_weights", i32 1, i32 100}
 

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to