https://github.com/mcinally updated 
https://github.com/llvm/llvm-project/pull/142800

>From 918b853de8c43dacebecb42cafa6d3b8fec15b47 Mon Sep 17 00:00:00 2001
From: Cameron McInally <cmcina...@nvidia.com>
Date: Tue, 3 Jun 2025 11:12:42 -0700
Subject: [PATCH 1/5] [Driver] Move CommonArgs to a location visible by the
 Frontend Drivers

This patch moves the CommonArgs utilities into a location visible by the
Frontend Drivers, so that the Frontend Drivers may share option parsing code
with the Compiler Driver. This is useful when the Frontend Drivers would like
to verify that their incoming options are well-formed and also not reinvent the
option parsing wheel.

We already see code in the Clang/Flang Drivers that is parsing and verifying its
incoming options. E.g. OPT_ffp_contract. This option is parsed in the Compiler
Driver, Clang Driver, and Flang Driver, all with slightly different parsing
code. It would be nice if the Frontend Drivers were not required to duplicate
this Compiler Driver code. That way there is no maintenace burden on keeping all
these parsing functions in sync.

Along those lines, the Frontend Drivers will now have a useful mechanism to
verify their incoming options are well-formed. Currently, the Frontend Drivers
trust that the Compiler Driver is not passing back junk. In some cases, the
Language Drivers will accept junk with no error at all. E.g.:

  `clang -cc1 -mprefer-vector-width=junk test.c'

With this patch, we'll now be able to tighten up incomming options to the
Frontend drivers in a lightweight way.
---
 .../clang/Driver}/CommonArgs.h                |  6 ++++
 clang/lib/Driver/MultilibBuilder.cpp          |  2 +-
 clang/lib/Driver/ToolChain.cpp                |  2 +-
 clang/lib/Driver/ToolChains/AIX.cpp           |  2 +-
 clang/lib/Driver/ToolChains/AMDGPU.cpp        |  2 +-
 clang/lib/Driver/ToolChains/AVR.cpp           |  2 +-
 clang/lib/Driver/ToolChains/Arch/AArch64.cpp  |  2 +-
 .../lib/Driver/ToolChains/Arch/LoongArch.cpp  |  2 +-
 clang/lib/Driver/ToolChains/Arch/Mips.cpp     |  2 +-
 clang/lib/Driver/ToolChains/Arch/PPC.cpp      |  2 +-
 clang/lib/Driver/ToolChains/Arch/RISCV.cpp    |  2 +-
 clang/lib/Driver/ToolChains/BareMetal.cpp     |  2 +-
 clang/lib/Driver/ToolChains/CSKYToolChain.cpp |  2 +-
 clang/lib/Driver/ToolChains/Clang.cpp         | 26 ++---------------
 clang/lib/Driver/ToolChains/CommonArgs.cpp    | 29 ++++++++++++++++++-
 clang/lib/Driver/ToolChains/CrossWindows.cpp  |  2 +-
 clang/lib/Driver/ToolChains/Cuda.cpp          |  2 +-
 clang/lib/Driver/ToolChains/Cygwin.cpp        |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp        |  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp     |  2 +-
 clang/lib/Driver/ToolChains/Flang.cpp         |  2 +-
 clang/lib/Driver/ToolChains/FreeBSD.cpp       |  2 +-
 clang/lib/Driver/ToolChains/Fuchsia.cpp       |  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp           |  2 +-
 clang/lib/Driver/ToolChains/HIPAMD.cpp        |  2 +-
 clang/lib/Driver/ToolChains/HIPSPV.cpp        |  2 +-
 clang/lib/Driver/ToolChains/HIPUtility.cpp    |  2 +-
 clang/lib/Driver/ToolChains/HLSL.cpp          |  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp         |  2 +-
 clang/lib/Driver/ToolChains/Hexagon.cpp       |  2 +-
 clang/lib/Driver/ToolChains/Hurd.cpp          |  2 +-
 .../lib/Driver/ToolChains/InterfaceStubs.cpp  |  2 +-
 clang/lib/Driver/ToolChains/Linux.cpp         |  2 +-
 clang/lib/Driver/ToolChains/MSP430.cpp        |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp          |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp         |  2 +-
 clang/lib/Driver/ToolChains/NaCl.cpp          |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp        |  2 +-
 clang/lib/Driver/ToolChains/OHOS.cpp          |  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp       |  2 +-
 clang/lib/Driver/ToolChains/PS4CPU.cpp        |  2 +-
 .../lib/Driver/ToolChains/RISCVToolchain.cpp  |  2 +-
 clang/lib/Driver/ToolChains/SPIRV.cpp         |  2 +-
 clang/lib/Driver/ToolChains/SPIRVOpenMP.cpp   |  2 +-
 clang/lib/Driver/ToolChains/SYCL.cpp          |  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp       |  2 +-
 clang/lib/Driver/ToolChains/UEFI.cpp          |  2 +-
 clang/lib/Driver/ToolChains/VEToolchain.cpp   |  2 +-
 clang/lib/Driver/ToolChains/WebAssembly.cpp   |  2 +-
 clang/lib/Driver/ToolChains/XCore.cpp         |  2 +-
 clang/lib/Driver/ToolChains/ZOS.cpp           |  2 +-
 clang/lib/Driver/XRayArgs.cpp                 |  2 +-
 .../unittests/Driver/MultilibBuilderTest.cpp  |  2 +-
 clang/unittests/Driver/MultilibTest.cpp       |  2 +-
 flang/lib/Frontend/CompilerInvocation.cpp     | 20 +++++--------
 flang/test/Driver/prefer-vector-width.f90     |  2 +-
 56 files changed, 96 insertions(+), 89 deletions(-)
 rename clang/{lib/Driver/ToolChains => include/clang/Driver}/CommonArgs.h (98%)

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h 
b/clang/include/clang/Driver/CommonArgs.h
similarity index 98%
rename from clang/lib/Driver/ToolChains/CommonArgs.h
rename to clang/include/clang/Driver/CommonArgs.h
index b5b9c1e66e380..048f2eab6887e 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.h
+++ b/clang/include/clang/Driver/CommonArgs.h
@@ -270,6 +270,12 @@ void handleVectorizeLoopsArgs(const llvm::opt::ArgList 
&Args,
 /// Enable -fslp-vectorize based on the optimization level selected.
 void handleVectorizeSLPArgs(const llvm::opt::ArgList &Args,
                             llvm::opt::ArgStringList &CmdArgs);
+
+void ParseMPreferVectorWidthOption(clang::DiagnosticsEngine &Diags,
+                                   const llvm::opt::ArgList &Args,
+                                   llvm::opt::ArgStringList &CmdArgs,
+                                   bool isCompilerDriver);
+
 } // end namespace tools
 } // end namespace driver
 } // end namespace clang
diff --git a/clang/lib/Driver/MultilibBuilder.cpp 
b/clang/lib/Driver/MultilibBuilder.cpp
index 8440a82f78bef..9d44d8681cf8a 100644
--- a/clang/lib/Driver/MultilibBuilder.cpp
+++ b/clang/lib/Driver/MultilibBuilder.cpp
@@ -7,7 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "clang/Driver/MultilibBuilder.h"
-#include "ToolChains/CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "llvm/ADT/StringMap.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/Regex.h"
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index ce302b308fd19..91a17b6c49fd7 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -11,13 +11,13 @@
 #include "ToolChains/Arch/ARM.h"
 #include "ToolChains/Arch/RISCV.h"
 #include "ToolChains/Clang.h"
-#include "ToolChains/CommonArgs.h"
 #include "ToolChains/Flang.h"
 #include "ToolChains/InterfaceStubs.h"
 #include "clang/Basic/ObjCRuntime.h"
 #include "clang/Basic/Sanitizers.h"
 #include "clang/Config/config.h"
 #include "clang/Driver/Action.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/InputInfo.h"
 #include "clang/Driver/Job.h"
diff --git a/clang/lib/Driver/ToolChains/AIX.cpp 
b/clang/lib/Driver/ToolChains/AIX.cpp
index a1a94e37116ce..066b59305fe3f 100644
--- a/clang/lib/Driver/ToolChains/AIX.cpp
+++ b/clang/lib/Driver/ToolChains/AIX.cpp
@@ -7,7 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "AIX.h"
-#include "CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Options.h"
 #include "clang/Driver/SanitizerArgs.h"
diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp 
b/clang/lib/Driver/ToolChains/AMDGPU.cpp
index dfbe936d5a5d3..cf9c24f1e1cde 100644
--- a/clang/lib/Driver/ToolChains/AMDGPU.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp
@@ -7,9 +7,9 @@
 
//===----------------------------------------------------------------------===//
 
 #include "AMDGPU.h"
-#include "CommonArgs.h"
 #include "clang/Basic/TargetID.h"
 #include "clang/Config/config.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/InputInfo.h"
 #include "clang/Driver/Options.h"
diff --git a/clang/lib/Driver/ToolChains/AVR.cpp 
b/clang/lib/Driver/ToolChains/AVR.cpp
index f1529f857eef8..b0523a7f4e40e 100644
--- a/clang/lib/Driver/ToolChains/AVR.cpp
+++ b/clang/lib/Driver/ToolChains/AVR.cpp
@@ -7,7 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "AVR.h"
-#include "CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/InputInfo.h"
 #include "clang/Driver/Options.h"
diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp 
b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
index eaae9f876e3ad..ea906d2e2acfc 100644
--- a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
@@ -7,7 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "AArch64.h"
-#include "../CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
 #include "llvm/Option/ArgList.h"
diff --git a/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp 
b/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp
index a35f8276737ff..3318e498a74f9 100644
--- a/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp
@@ -8,8 +8,8 @@
 
 #include "LoongArch.h"
 #include "../Clang.h"
-#include "ToolChains/CommonArgs.h"
 #include "clang/Basic/DiagnosticDriver.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
 #include "llvm/TargetParser/Host.h"
diff --git a/clang/lib/Driver/ToolChains/Arch/Mips.cpp 
b/clang/lib/Driver/ToolChains/Arch/Mips.cpp
index 0d847587e8664..8787c8276721c 100644
--- a/clang/lib/Driver/ToolChains/Arch/Mips.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/Mips.cpp
@@ -7,7 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "Mips.h"
-#include "ToolChains/CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
 #include "llvm/ADT/StringSwitch.h"
diff --git a/clang/lib/Driver/ToolChains/Arch/PPC.cpp 
b/clang/lib/Driver/ToolChains/Arch/PPC.cpp
index afa86230085ec..361a68a892a8f 100644
--- a/clang/lib/Driver/ToolChains/Arch/PPC.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/PPC.cpp
@@ -7,7 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "PPC.h"
-#include "ToolChains/CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
 #include "llvm/ADT/StringSwitch.h"
diff --git a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp 
b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
index d0b620980bcef..baa2c8c0bcfb2 100644
--- a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
@@ -8,7 +8,7 @@
 
 #include "RISCV.h"
 #include "../Clang.h"
-#include "ToolChains/CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
 #include "llvm/Option/ArgList.h"
diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp 
b/clang/lib/Driver/ToolChains/BareMetal.cpp
index 6bf2302d3bd99..d8168ed15febd 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -8,8 +8,8 @@
 
 #include "BareMetal.h"
 
-#include "CommonArgs.h"
 #include "Gnu.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/InputInfo.h"
 
 #include "Arch/ARM.h"
diff --git a/clang/lib/Driver/ToolChains/CSKYToolChain.cpp 
b/clang/lib/Driver/ToolChains/CSKYToolChain.cpp
index e944cba0eb23c..e4db3307ee3aa 100644
--- a/clang/lib/Driver/ToolChains/CSKYToolChain.cpp
+++ b/clang/lib/Driver/ToolChains/CSKYToolChain.cpp
@@ -7,7 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "CSKYToolChain.h"
-#include "CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/InputInfo.h"
 #include "clang/Driver/Options.h"
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 13842b8cc2870..bb3baa7cec4c0 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -14,7 +14,6 @@
 #include "Arch/RISCV.h"
 #include "Arch/Sparc.h"
 #include "Arch/SystemZ.h"
-#include "CommonArgs.h"
 #include "Hexagon.h"
 #include "PS4CPU.h"
 #include "clang/Basic/CLWarnings.h"
@@ -26,6 +25,7 @@
 #include "clang/Basic/Version.h"
 #include "clang/Config/config.h"
 #include "clang/Driver/Action.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Distro.h"
 #include "clang/Driver/InputInfo.h"
 #include "clang/Driver/Options.h"
@@ -264,27 +264,6 @@ static void ParseMRecip(const Driver &D, const ArgList 
&Args,
   OutStrings.push_back(Args.MakeArgString(Out));
 }
 
-/// The -mprefer-vector-width option accepts either a positive integer
-/// or the string "none".
-static void ParseMPreferVectorWidth(const Driver &D, const ArgList &Args,
-                                    ArgStringList &CmdArgs) {
-  Arg *A = Args.getLastArg(options::OPT_mprefer_vector_width_EQ);
-  if (!A)
-    return;
-
-  StringRef Value = A->getValue();
-  if (Value == "none") {
-    CmdArgs.push_back("-mprefer-vector-width=none");
-  } else {
-    unsigned Width;
-    if (Value.getAsInteger(10, Width)) {
-      D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Value;
-      return;
-    }
-    CmdArgs.push_back(Args.MakeArgString("-mprefer-vector-width=" + Value));
-  }
-}
-
 static bool
 shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
                                           const llvm::Triple &Triple) {
@@ -7607,7 +7586,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction 
&JA,
 
   handleVectorizeLoopsArgs(Args, CmdArgs);
   handleVectorizeSLPArgs(Args, CmdArgs);
-  ParseMPreferVectorWidth(D, Args, CmdArgs);
+  ParseMPreferVectorWidthOption(D.getDiags(), Args, CmdArgs,
+                                /*isCompilerDriver=*/true);
 
   Args.AddLastArg(CmdArgs, options::OPT_fshow_overloads_EQ);
   Args.AddLastArg(CmdArgs,
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 937ee09cac7cc..d927fc6d8b54b 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -6,7 +6,7 @@
 //
 
//===----------------------------------------------------------------------===//
 
-#include "CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "Arch/AArch64.h"
 #include "Arch/ARM.h"
 #include "Arch/CSKY.h"
@@ -3167,3 +3167,30 @@ void tools::handleInterchangeLoopsArgs(const ArgList 
&Args,
                    options::OPT_fno_loop_interchange, EnableInterchange))
     CmdArgs.push_back("-floop-interchange");
 }
+
+void tools::ParseMPreferVectorWidthOption(clang::DiagnosticsEngine &Diags,
+                                          const llvm::opt::ArgList &Args,
+                                          ArgStringList &CmdArgs,
+                                          bool isCompilerDriver) {
+  // If this was invoked by the Compiler Driver, we pass through the option
+  // as-is. Otherwise, if this is the Frontend Driver, we want just the value.
+  StringRef Out = (isCompilerDriver) ? "-mprefer-vector-width=" : "";
+
+  Arg *A = 
Args.getLastArg(clang::driver::options::OPT_mprefer_vector_width_EQ);
+  if (!A)
+    return;
+
+  StringRef Value = A->getValue();
+  unsigned Width;
+
+  // Only "none" and Integer values are accepted by
+  // -mprefer-vector-width=<value>.
+  if (Value != "none" && Value.getAsInteger(10, Width)) {
+    Diags.Report(clang::diag::err_drv_invalid_value)
+        << A->getOption().getName() << Value;
+    return;
+  }
+
+  CmdArgs.push_back(Args.MakeArgString(Out + Value));
+  return;
+}
diff --git a/clang/lib/Driver/ToolChains/CrossWindows.cpp 
b/clang/lib/Driver/ToolChains/CrossWindows.cpp
index 3c5dfba329cf8..51c892fc91718 100644
--- a/clang/lib/Driver/ToolChains/CrossWindows.cpp
+++ b/clang/lib/Driver/ToolChains/CrossWindows.cpp
@@ -7,7 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "CrossWindows.h"
-#include "CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
diff --git a/clang/lib/Driver/ToolChains/Cuda.cpp 
b/clang/lib/Driver/ToolChains/Cuda.cpp
index 073861dade4f7..a91e4de41c8da 100644
--- a/clang/lib/Driver/ToolChains/Cuda.cpp
+++ b/clang/lib/Driver/ToolChains/Cuda.cpp
@@ -7,9 +7,9 @@
 
//===----------------------------------------------------------------------===//
 
 #include "Cuda.h"
-#include "CommonArgs.h"
 #include "clang/Basic/Cuda.h"
 #include "clang/Config/config.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Distro.h"
 #include "clang/Driver/Driver.h"
diff --git a/clang/lib/Driver/ToolChains/Cygwin.cpp 
b/clang/lib/Driver/ToolChains/Cygwin.cpp
index f0e90deee98b3..d9c16347daa34 100644
--- a/clang/lib/Driver/ToolChains/Cygwin.cpp
+++ b/clang/lib/Driver/ToolChains/Cygwin.cpp
@@ -7,8 +7,8 @@
 
//===----------------------------------------------------------------------===//
 
 #include "Cygwin.h"
-#include "CommonArgs.h"
 #include "clang/Config/config.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
 #include "llvm/Support/Path.h"
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp 
b/clang/lib/Driver/ToolChains/Darwin.cpp
index 0be7180098359..81e613cf7cdc7 100644
--- a/clang/lib/Driver/ToolChains/Darwin.cpp
+++ b/clang/lib/Driver/ToolChains/Darwin.cpp
@@ -8,10 +8,10 @@
 
 #include "Darwin.h"
 #include "Arch/ARM.h"
-#include "CommonArgs.h"
 #include "clang/Basic/AlignedAllocation.h"
 #include "clang/Basic/ObjCRuntime.h"
 #include "clang/Config/config.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
diff --git a/clang/lib/Driver/ToolChains/DragonFly.cpp 
b/clang/lib/Driver/ToolChains/DragonFly.cpp
index 38a29ae49e8d9..524f5f2ff391e 100644
--- a/clang/lib/Driver/ToolChains/DragonFly.cpp
+++ b/clang/lib/Driver/ToolChains/DragonFly.cpp
@@ -7,7 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "DragonFly.h"
-#include "CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp 
b/clang/lib/Driver/ToolChains/Flang.cpp
index dcc46469df3e9..e0a366bfb9225 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -8,9 +8,9 @@
 
 #include "Flang.h"
 #include "Arch/RISCV.h"
-#include "CommonArgs.h"
 
 #include "clang/Basic/CodeGenOptions.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Options.h"
 #include "llvm/Frontend/Debug/Options.h"
 #include "llvm/Support/Path.h"
diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp 
b/clang/lib/Driver/ToolChains/FreeBSD.cpp
index ccf6987a2ea65..b17b76233ad30 100644
--- a/clang/lib/Driver/ToolChains/FreeBSD.cpp
+++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp
@@ -10,8 +10,8 @@
 #include "Arch/ARM.h"
 #include "Arch/Mips.h"
 #include "Arch/Sparc.h"
-#include "CommonArgs.h"
 #include "clang/Config/config.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Options.h"
 #include "clang/Driver/SanitizerArgs.h"
diff --git a/clang/lib/Driver/ToolChains/Fuchsia.cpp 
b/clang/lib/Driver/ToolChains/Fuchsia.cpp
index 910db1dde0d18..1c165bbfe84f5 100644
--- a/clang/lib/Driver/ToolChains/Fuchsia.cpp
+++ b/clang/lib/Driver/ToolChains/Fuchsia.cpp
@@ -7,8 +7,8 @@
 
//===----------------------------------------------------------------------===//
 
 #include "Fuchsia.h"
-#include "CommonArgs.h"
 #include "clang/Config/config.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/MultilibBuilder.h"
diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp 
b/clang/lib/Driver/ToolChains/Gnu.cpp
index e42cd0f97cb49..9c68c5c6de2b2 100644
--- a/clang/lib/Driver/ToolChains/Gnu.cpp
+++ b/clang/lib/Driver/ToolChains/Gnu.cpp
@@ -15,8 +15,8 @@
 #include "Arch/RISCV.h"
 #include "Arch/Sparc.h"
 #include "Arch/SystemZ.h"
-#include "CommonArgs.h"
 #include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/MultilibBuilder.h"
diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp 
b/clang/lib/Driver/ToolChains/HIPAMD.cpp
index fc067e9052275..a8f2b09b1b20f 100644
--- a/clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -8,10 +8,10 @@
 
 #include "HIPAMD.h"
 #include "AMDGPU.h"
-#include "CommonArgs.h"
 #include "HIPUtility.h"
 #include "SPIRV.h"
 #include "clang/Basic/Cuda.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/InputInfo.h"
diff --git a/clang/lib/Driver/ToolChains/HIPSPV.cpp 
b/clang/lib/Driver/ToolChains/HIPSPV.cpp
index 02ec36df273af..ec29c62976e10 100644
--- a/clang/lib/Driver/ToolChains/HIPSPV.cpp
+++ b/clang/lib/Driver/ToolChains/HIPSPV.cpp
@@ -7,8 +7,8 @@
 
//===----------------------------------------------------------------------===//
 
 #include "HIPSPV.h"
-#include "CommonArgs.h"
 #include "HIPUtility.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/InputInfo.h"
diff --git a/clang/lib/Driver/ToolChains/HIPUtility.cpp 
b/clang/lib/Driver/ToolChains/HIPUtility.cpp
index 8a3dd494f3b4f..cb061ffede234 100644
--- a/clang/lib/Driver/ToolChains/HIPUtility.cpp
+++ b/clang/lib/Driver/ToolChains/HIPUtility.cpp
@@ -7,7 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "HIPUtility.h"
-#include "CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Options.h"
 #include "llvm/ADT/StringExtras.h"
diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp 
b/clang/lib/Driver/ToolChains/HLSL.cpp
index eb8f6881bffc7..dcc51e182924c 100644
--- a/clang/lib/Driver/ToolChains/HLSL.cpp
+++ b/clang/lib/Driver/ToolChains/HLSL.cpp
@@ -7,7 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "HLSL.h"
-#include "CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Job.h"
 #include "llvm/ADT/StringSwitch.h"
diff --git a/clang/lib/Driver/ToolChains/Haiku.cpp 
b/clang/lib/Driver/ToolChains/Haiku.cpp
index 5d0d8b7f5024c..dd6ada8f56972 100644
--- a/clang/lib/Driver/ToolChains/Haiku.cpp
+++ b/clang/lib/Driver/ToolChains/Haiku.cpp
@@ -7,8 +7,8 @@
 
//===----------------------------------------------------------------------===//
 
 #include "Haiku.h"
-#include "CommonArgs.h"
 #include "clang/Config/config.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/SanitizerArgs.h"
 #include "llvm/Support/Path.h"
diff --git a/clang/lib/Driver/ToolChains/Hexagon.cpp 
b/clang/lib/Driver/ToolChains/Hexagon.cpp
index bed8de94130c5..9f8b676fc7dc2 100644
--- a/clang/lib/Driver/ToolChains/Hexagon.cpp
+++ b/clang/lib/Driver/ToolChains/Hexagon.cpp
@@ -7,7 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "Hexagon.h"
-#include "CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/InputInfo.h"
diff --git a/clang/lib/Driver/ToolChains/Hurd.cpp 
b/clang/lib/Driver/ToolChains/Hurd.cpp
index 0bc114b90ffc0..a22a8face1797 100644
--- a/clang/lib/Driver/ToolChains/Hurd.cpp
+++ b/clang/lib/Driver/ToolChains/Hurd.cpp
@@ -7,8 +7,8 @@
 
//===----------------------------------------------------------------------===//
 
 #include "Hurd.h"
-#include "CommonArgs.h"
 #include "clang/Config/config.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
 #include "llvm/Support/Path.h"
diff --git a/clang/lib/Driver/ToolChains/InterfaceStubs.cpp 
b/clang/lib/Driver/ToolChains/InterfaceStubs.cpp
index 05a13db8d0cff..59a6742c406c2 100644
--- a/clang/lib/Driver/ToolChains/InterfaceStubs.cpp
+++ b/clang/lib/Driver/ToolChains/InterfaceStubs.cpp
@@ -7,7 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "InterfaceStubs.h"
-#include "CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "llvm/Support/Path.h"
 
diff --git a/clang/lib/Driver/ToolChains/Linux.cpp 
b/clang/lib/Driver/ToolChains/Linux.cpp
index 19919cf5136d8..151b2bfced818 100644
--- a/clang/lib/Driver/ToolChains/Linux.cpp
+++ b/clang/lib/Driver/ToolChains/Linux.cpp
@@ -12,8 +12,8 @@
 #include "Arch/Mips.h"
 #include "Arch/PPC.h"
 #include "Arch/RISCV.h"
-#include "CommonArgs.h"
 #include "clang/Config/config.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Distro.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
diff --git a/clang/lib/Driver/ToolChains/MSP430.cpp 
b/clang/lib/Driver/ToolChains/MSP430.cpp
index be0f9f2145383..9eca1ad5f2865 100644
--- a/clang/lib/Driver/ToolChains/MSP430.cpp
+++ b/clang/lib/Driver/ToolChains/MSP430.cpp
@@ -7,8 +7,8 @@
 
//===----------------------------------------------------------------------===//
 
 #include "MSP430.h"
-#include "CommonArgs.h"
 #include "Gnu.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/InputInfo.h"
 #include "clang/Driver/Multilib.h"
diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp 
b/clang/lib/Driver/ToolChains/MSVC.cpp
index a14691c5a4e7a..1e244865b2117 100644
--- a/clang/lib/Driver/ToolChains/MSVC.cpp
+++ b/clang/lib/Driver/ToolChains/MSVC.cpp
@@ -7,9 +7,9 @@
 
//===----------------------------------------------------------------------===//
 
 #include "MSVC.h"
-#include "CommonArgs.h"
 #include "Darwin.h"
 #include "clang/Config/config.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp 
b/clang/lib/Driver/ToolChains/MinGW.cpp
index 2245b036b8459..7d093d20b3dd9 100644
--- a/clang/lib/Driver/ToolChains/MinGW.cpp
+++ b/clang/lib/Driver/ToolChains/MinGW.cpp
@@ -7,8 +7,8 @@
 
//===----------------------------------------------------------------------===//
 
 #include "MinGW.h"
-#include "CommonArgs.h"
 #include "clang/Config/config.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/InputInfo.h"
diff --git a/clang/lib/Driver/ToolChains/NaCl.cpp 
b/clang/lib/Driver/ToolChains/NaCl.cpp
index ab619615d67e7..f7acaa1f3a78d 100644
--- a/clang/lib/Driver/ToolChains/NaCl.cpp
+++ b/clang/lib/Driver/ToolChains/NaCl.cpp
@@ -7,7 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "NaCl.h"
-#include "CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/InputInfo.h"
diff --git a/clang/lib/Driver/ToolChains/NetBSD.cpp 
b/clang/lib/Driver/ToolChains/NetBSD.cpp
index ae164be1b4e8b..8db00deeb80df 100644
--- a/clang/lib/Driver/ToolChains/NetBSD.cpp
+++ b/clang/lib/Driver/ToolChains/NetBSD.cpp
@@ -10,8 +10,8 @@
 #include "Arch/ARM.h"
 #include "Arch/Mips.h"
 #include "Arch/Sparc.h"
-#include "CommonArgs.h"
 #include "clang/Config/config.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
diff --git a/clang/lib/Driver/ToolChains/OHOS.cpp 
b/clang/lib/Driver/ToolChains/OHOS.cpp
index 72f36d08f4da7..00991504e97a8 100644
--- a/clang/lib/Driver/ToolChains/OHOS.cpp
+++ b/clang/lib/Driver/ToolChains/OHOS.cpp
@@ -8,8 +8,8 @@
 
 #include "OHOS.h"
 #include "Arch/ARM.h"
-#include "CommonArgs.h"
 #include "clang/Config/config.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
diff --git a/clang/lib/Driver/ToolChains/OpenBSD.cpp 
b/clang/lib/Driver/ToolChains/OpenBSD.cpp
index 668626259809e..79b1b6960da1f 100644
--- a/clang/lib/Driver/ToolChains/OpenBSD.cpp
+++ b/clang/lib/Driver/ToolChains/OpenBSD.cpp
@@ -10,8 +10,8 @@
 #include "Arch/ARM.h"
 #include "Arch/Mips.h"
 #include "Arch/Sparc.h"
-#include "CommonArgs.h"
 #include "clang/Config/config.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Options.h"
 #include "clang/Driver/SanitizerArgs.h"
diff --git a/clang/lib/Driver/ToolChains/PS4CPU.cpp 
b/clang/lib/Driver/ToolChains/PS4CPU.cpp
index cb56a7ebeba24..e965786d269fa 100644
--- a/clang/lib/Driver/ToolChains/PS4CPU.cpp
+++ b/clang/lib/Driver/ToolChains/PS4CPU.cpp
@@ -7,8 +7,8 @@
 
//===----------------------------------------------------------------------===//
 
 #include "PS4CPU.h"
-#include "CommonArgs.h"
 #include "clang/Config/config.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
diff --git a/clang/lib/Driver/ToolChains/RISCVToolchain.cpp 
b/clang/lib/Driver/ToolChains/RISCVToolchain.cpp
index d88ddc264d72a..42bbc130637be 100644
--- a/clang/lib/Driver/ToolChains/RISCVToolchain.cpp
+++ b/clang/lib/Driver/ToolChains/RISCVToolchain.cpp
@@ -7,7 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "RISCVToolchain.h"
-#include "CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/InputInfo.h"
 #include "clang/Driver/Options.h"
diff --git a/clang/lib/Driver/ToolChains/SPIRV.cpp 
b/clang/lib/Driver/ToolChains/SPIRV.cpp
index d9292cf01f8d4..ea824dbad54cb 100644
--- a/clang/lib/Driver/ToolChains/SPIRV.cpp
+++ b/clang/lib/Driver/ToolChains/SPIRV.cpp
@@ -6,7 +6,7 @@
 //
 
//===----------------------------------------------------------------------===//
 #include "SPIRV.h"
-#include "CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/InputInfo.h"
diff --git a/clang/lib/Driver/ToolChains/SPIRVOpenMP.cpp 
b/clang/lib/Driver/ToolChains/SPIRVOpenMP.cpp
index a688fd8d9fb50..4e09d5eac26fd 100644
--- a/clang/lib/Driver/ToolChains/SPIRVOpenMP.cpp
+++ b/clang/lib/Driver/ToolChains/SPIRVOpenMP.cpp
@@ -6,7 +6,7 @@
 //
 
//==------------------------------------------------------------------------==//
 #include "SPIRVOpenMP.h"
-#include "CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 
 using namespace clang::driver;
 using namespace clang::driver::toolchains;
diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp 
b/clang/lib/Driver/ToolChains/SYCL.cpp
index 6611c142a5efd..0232b047a6c4b 100644
--- a/clang/lib/Driver/ToolChains/SYCL.cpp
+++ b/clang/lib/Driver/ToolChains/SYCL.cpp
@@ -6,7 +6,7 @@
 //
 
//===----------------------------------------------------------------------===//
 #include "SYCL.h"
-#include "CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 
 using namespace clang::driver;
 using namespace clang::driver::toolchains;
diff --git a/clang/lib/Driver/ToolChains/Solaris.cpp 
b/clang/lib/Driver/ToolChains/Solaris.cpp
index 48d1002381761..a3574e1b701e8 100644
--- a/clang/lib/Driver/ToolChains/Solaris.cpp
+++ b/clang/lib/Driver/ToolChains/Solaris.cpp
@@ -7,10 +7,10 @@
 
//===----------------------------------------------------------------------===//
 
 #include "Solaris.h"
-#include "CommonArgs.h"
 #include "Gnu.h"
 #include "clang/Basic/LangStandard.h"
 #include "clang/Config/config.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
diff --git a/clang/lib/Driver/ToolChains/UEFI.cpp 
b/clang/lib/Driver/ToolChains/UEFI.cpp
index 2ef719bb43aae..ac6668e6bdd5f 100644
--- a/clang/lib/Driver/ToolChains/UEFI.cpp
+++ b/clang/lib/Driver/ToolChains/UEFI.cpp
@@ -7,8 +7,8 @@
 
//===----------------------------------------------------------------------===//
 
 #include "UEFI.h"
-#include "CommonArgs.h"
 #include "clang/Config/config.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
diff --git a/clang/lib/Driver/ToolChains/VEToolchain.cpp 
b/clang/lib/Driver/ToolChains/VEToolchain.cpp
index cf85a691dbdb7..ad9129046c3e1 100644
--- a/clang/lib/Driver/ToolChains/VEToolchain.cpp
+++ b/clang/lib/Driver/ToolChains/VEToolchain.cpp
@@ -7,7 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "VEToolchain.h"
-#include "CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
diff --git a/clang/lib/Driver/ToolChains/WebAssembly.cpp 
b/clang/lib/Driver/ToolChains/WebAssembly.cpp
index b3ed496629992..5054868b5ff4d 100644
--- a/clang/lib/Driver/ToolChains/WebAssembly.cpp
+++ b/clang/lib/Driver/ToolChains/WebAssembly.cpp
@@ -7,9 +7,9 @@
 
//===----------------------------------------------------------------------===//
 
 #include "WebAssembly.h"
-#include "CommonArgs.h"
 #include "Gnu.h"
 #include "clang/Config/config.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
diff --git a/clang/lib/Driver/ToolChains/XCore.cpp 
b/clang/lib/Driver/ToolChains/XCore.cpp
index c95ebabdd30c4..6a2a75cb99739 100644
--- a/clang/lib/Driver/ToolChains/XCore.cpp
+++ b/clang/lib/Driver/ToolChains/XCore.cpp
@@ -7,7 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "XCore.h"
-#include "CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
diff --git a/clang/lib/Driver/ToolChains/ZOS.cpp 
b/clang/lib/Driver/ToolChains/ZOS.cpp
index d05202972825d..57bcb3c306cef 100644
--- a/clang/lib/Driver/ToolChains/ZOS.cpp
+++ b/clang/lib/Driver/ToolChains/ZOS.cpp
@@ -7,7 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "ZOS.h"
-#include "CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Options.h"
 #include "llvm/Option/ArgList.h"
diff --git a/clang/lib/Driver/XRayArgs.cpp b/clang/lib/Driver/XRayArgs.cpp
index 701dd2906dccb..ceed7cb6acbbf 100644
--- a/clang/lib/Driver/XRayArgs.cpp
+++ b/clang/lib/Driver/XRayArgs.cpp
@@ -6,7 +6,7 @@
 //
 
//===----------------------------------------------------------------------===//
 #include "clang/Driver/XRayArgs.h"
-#include "ToolChains/CommonArgs.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Options.h"
 #include "clang/Driver/ToolChain.h"
diff --git a/clang/unittests/Driver/MultilibBuilderTest.cpp 
b/clang/unittests/Driver/MultilibBuilderTest.cpp
index 0e5385c913533..38c9344d2966d 100644
--- a/clang/unittests/Driver/MultilibBuilderTest.cpp
+++ b/clang/unittests/Driver/MultilibBuilderTest.cpp
@@ -12,9 +12,9 @@
 
//===----------------------------------------------------------------------===//
 
 #include "clang/Driver/MultilibBuilder.h"
-#include "../../lib/Driver/ToolChains/CommonArgs.h"
 #include "SimpleDiagnosticConsumer.h"
 #include "clang/Basic/LLVM.h"
+#include "clang/Driver/CommonArgs.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringSwitch.h"
diff --git a/clang/unittests/Driver/MultilibTest.cpp 
b/clang/unittests/Driver/MultilibTest.cpp
index c03e117d99304..4c11e6a32d7c8 100644
--- a/clang/unittests/Driver/MultilibTest.cpp
+++ b/clang/unittests/Driver/MultilibTest.cpp
@@ -11,10 +11,10 @@
 
//===----------------------------------------------------------------------===//
 
 #include "clang/Driver/Multilib.h"
-#include "../../lib/Driver/ToolChains/CommonArgs.h"
 #include "SimpleDiagnosticConsumer.h"
 #include "clang/Basic/LLVM.h"
 #include "clang/Basic/Version.h"
+#include "clang/Driver/CommonArgs.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringSwitch.h"
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp 
b/flang/lib/Frontend/CompilerInvocation.cpp
index 90a002929eff0..55383e064df5a 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -23,6 +23,7 @@
 #include "clang/Basic/AllDiagnostics.h"
 #include "clang/Basic/DiagnosticDriver.h"
 #include "clang/Basic/DiagnosticOptions.h"
+#include "clang/Driver/CommonArgs.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/DriverDiagnostic.h"
 #include "clang/Driver/OptionUtils.h"
@@ -309,19 +310,12 @@ static void 
parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts,
   for (auto *a : args.filtered(clang::driver::options::OPT_fpass_plugin_EQ))
     opts.LLVMPassPlugins.push_back(a->getValue());
 
-  // -mprefer_vector_width option
-  if (const llvm::opt::Arg *a = args.getLastArg(
-          clang::driver::options::OPT_mprefer_vector_width_EQ)) {
-    llvm::StringRef s = a->getValue();
-    unsigned width;
-    if (s == "none")
-      opts.PreferVectorWidth = "none";
-    else if (s.getAsInteger(10, width))
-      diags.Report(clang::diag::err_drv_invalid_value)
-          << a->getAsString(args) << a->getValue();
-    else
-      opts.PreferVectorWidth = s.str();
-  }
+  llvm::opt::ArgStringList result;
+  clang::driver::tools::ParseMPreferVectorWidthOption(
+      diags, args, result,
+      /*isCompilerDriver=*/false);
+  if (result.size() > 0)
+    opts.PreferVectorWidth = result[0];
 
   // -fembed-offload-object option
   for (auto *a :
diff --git a/flang/test/Driver/prefer-vector-width.f90 
b/flang/test/Driver/prefer-vector-width.f90
index 3622b28056332..89dc6d35d8bac 100644
--- a/flang/test/Driver/prefer-vector-width.f90
+++ b/flang/test/Driver/prefer-vector-width.f90
@@ -15,4 +15,4 @@ end subroutine func
 ! CHECK-NONE-SAME: "prefer-vector-width"="none"
 ! CHECK-128-SAME: "prefer-vector-width"="128"
 ! CHECK-256-SAME: "prefer-vector-width"="256"
-! CHECK-INVALID: error: invalid value 'xxx' in '-mprefer-vector-width=xxx'
\ No newline at end of file
+! CHECK-INVALID: error: invalid value 'xxx' in 'mprefer-vector-width='

>From aef6882b2fcfc913b2c6d89c19efe6b69703f172 Mon Sep 17 00:00:00 2001
From: Cameron McInally <cmcina...@nvidia.com>
Date: Thu, 5 Jun 2025 09:59:19 -0700
Subject: [PATCH 2/5] [Driver] Move CommonArgs to a location visible by the
 Frontend Drivers

Update initial patch to use std::optional return values for the parsing
functions. This is a more elegant way of returning just the Values to
the Frontend Drivers.
---
 clang/include/clang/Driver/CommonArgs.h    |  7 +++----
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 13 ++++++-------
 flang/lib/Frontend/CompilerInvocation.cpp  |  6 ++----
 3 files changed, 11 insertions(+), 15 deletions(-)

diff --git a/clang/include/clang/Driver/CommonArgs.h 
b/clang/include/clang/Driver/CommonArgs.h
index 048f2eab6887e..eed256324c3d3 100644
--- a/clang/include/clang/Driver/CommonArgs.h
+++ b/clang/include/clang/Driver/CommonArgs.h
@@ -271,10 +271,9 @@ void handleVectorizeLoopsArgs(const llvm::opt::ArgList 
&Args,
 void handleVectorizeSLPArgs(const llvm::opt::ArgList &Args,
                             llvm::opt::ArgStringList &CmdArgs);
 
-void ParseMPreferVectorWidthOption(clang::DiagnosticsEngine &Diags,
-                                   const llvm::opt::ArgList &Args,
-                                   llvm::opt::ArgStringList &CmdArgs,
-                                   bool isCompilerDriver);
+std::optional<StringRef> ParseMPreferVectorWidthOption(
+    clang::DiagnosticsEngine &Diags, const llvm::opt::ArgList &Args,
+    llvm::opt::ArgStringList &CmdArgs, bool isCompilerDriver);
 
 } // end namespace tools
 } // end namespace driver
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index d927fc6d8b54b..9931f875fcd3a 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -3168,17 +3168,16 @@ void tools::handleInterchangeLoopsArgs(const ArgList 
&Args,
     CmdArgs.push_back("-floop-interchange");
 }
 
-void tools::ParseMPreferVectorWidthOption(clang::DiagnosticsEngine &Diags,
-                                          const llvm::opt::ArgList &Args,
-                                          ArgStringList &CmdArgs,
-                                          bool isCompilerDriver) {
+std::optional<StringRef> tools::ParseMPreferVectorWidthOption(
+    clang::DiagnosticsEngine &Diags, const llvm::opt::ArgList &Args,
+    ArgStringList &CmdArgs, bool isCompilerDriver) {
   // If this was invoked by the Compiler Driver, we pass through the option
   // as-is. Otherwise, if this is the Frontend Driver, we want just the value.
   StringRef Out = (isCompilerDriver) ? "-mprefer-vector-width=" : "";
 
   Arg *A = 
Args.getLastArg(clang::driver::options::OPT_mprefer_vector_width_EQ);
   if (!A)
-    return;
+    return std::nullopt;
 
   StringRef Value = A->getValue();
   unsigned Width;
@@ -3188,9 +3187,9 @@ void 
tools::ParseMPreferVectorWidthOption(clang::DiagnosticsEngine &Diags,
   if (Value != "none" && Value.getAsInteger(10, Width)) {
     Diags.Report(clang::diag::err_drv_invalid_value)
         << A->getOption().getName() << Value;
-    return;
+    return std::nullopt;
   }
 
   CmdArgs.push_back(Args.MakeArgString(Out + Value));
-  return;
+  return Value;
 }
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp 
b/flang/lib/Frontend/CompilerInvocation.cpp
index 9988ee2bea10c..ca39f80a34b83 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -311,11 +311,9 @@ static void 
parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts,
     opts.LLVMPassPlugins.push_back(a->getValue());
 
   llvm::opt::ArgStringList result;
-  clang::driver::tools::ParseMPreferVectorWidthOption(
+  opts.PreferVectorWidth = clang::driver::tools::ParseMPreferVectorWidthOption(
       diags, args, result,
-      /*isCompilerDriver=*/false);
-  if (result.size() > 0)
-    opts.PreferVectorWidth = result[0];
+      /*isCompilerDriver=*/false).value_or("");
 
   // -fembed-offload-object option
   for (auto *a :

>From db4482d071c5f49a6ee01eff939b5c3d2befa862 Mon Sep 17 00:00:00 2001
From: Cameron McInally <cmcina...@nvidia.com>
Date: Thu, 5 Jun 2025 10:36:37 -0700
Subject: [PATCH 3/5] Fix clang-format issues.

---
 flang/lib/Frontend/CompilerInvocation.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/flang/lib/Frontend/CompilerInvocation.cpp 
b/flang/lib/Frontend/CompilerInvocation.cpp
index ca39f80a34b83..d57717e2dfb0c 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -312,8 +312,9 @@ static void 
parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts,
 
   llvm::opt::ArgStringList result;
   opts.PreferVectorWidth = clang::driver::tools::ParseMPreferVectorWidthOption(
-      diags, args, result,
-      /*isCompilerDriver=*/false).value_or("");
+                               diags, args, result,
+                               /*isCompilerDriver=*/false)
+                               .value_or("");
 
   // -fembed-offload-object option
   for (auto *a :

>From a6535b1bdcc844ca2ea43e63b309a7b8227f7d2e Mon Sep 17 00:00:00 2001
From: Cameron McInally <cameron.mcina...@nyu.edu>
Date: Thu, 5 Jun 2025 17:26:29 -0400
Subject: [PATCH 4/5] Update clang/lib/Driver/ToolChains/CommonArgs.cpp

Co-authored-by: Shafik Yaghmour <shafik.yaghm...@intel.com>
---
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 9931f875fcd3a..1e8c6981077dd 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -3173,7 +3173,7 @@ std::optional<StringRef> 
tools::ParseMPreferVectorWidthOption(
     ArgStringList &CmdArgs, bool isCompilerDriver) {
   // If this was invoked by the Compiler Driver, we pass through the option
   // as-is. Otherwise, if this is the Frontend Driver, we want just the value.
-  StringRef Out = (isCompilerDriver) ? "-mprefer-vector-width=" : "";
+  StringRef Out = isCompilerDriver ? "-mprefer-vector-width=" : "";
 
   Arg *A = 
Args.getLastArg(clang::driver::options::OPT_mprefer_vector_width_EQ);
   if (!A)

>From ef34cdf1cc3b9d894af377f61b81cb0bf1d87391 Mon Sep 17 00:00:00 2001
From: Cameron McInally <cmcina...@nvidia.com>
Date: Thu, 5 Jun 2025 14:27:55 -0700
Subject: [PATCH 5/5] Add __attribute((uninitialized)) to
 lib/Driver/ToolChains/CommonArgs.cpp

---
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 1e8c6981077dd..6f877aa03712e 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -3180,7 +3180,7 @@ std::optional<StringRef> 
tools::ParseMPreferVectorWidthOption(
     return std::nullopt;
 
   StringRef Value = A->getValue();
-  unsigned Width;
+  unsigned Width __attribute((uninitialized));
 
   // Only "none" and Integer values are accepted by
   // -mprefer-vector-width=<value>.

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to