Skip to content

Conversation

@naveen-seth
Copy link
Contributor

@naveen-seth naveen-seth commented Oct 15, 2025

This change moves option-related code from clangDriver into a new clangOptions library.

This refactoring is part of a broader effort to support driver-managed builds for compilations using C++ named modules and/or Clang modules.
It is required for linking the dependency scanning tooling against the driver without introducing cyclic dependencies, which would otherwise cause build failures when dynamic linking is enabled.
In particular, clangFrontend must no longer depend on clangDriver for this to be possible.

This PR is motivated by the following review comment: #152770 (comment)

@llvmbot llvmbot added clang Clang issues not falling into any other category clang-tools-extra lldb backend:ARM backend:AArch64 backend:AMDGPU backend:Hexagon backend:MIPS backend:RISC-V backend:PowerPC backend:Sparc backend:SystemZ backend:X86 clangd clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' clang:frontend Language frontend issues, e.g. anything involving "Sema" llvm:mc Machine (object) code flang:driver flang Flang issues not falling into any other category backend:CSKY backend:SPIR-V backend:loongarch bazel "Peripheral" support tier build system: utils/bazel clang:openmp OpenMP related changes to Clang labels Oct 15, 2025
@llvmbot
Copy link
Member

llvmbot commented Oct 15, 2025

@llvm/pr-subscribers-flang-driver
@llvm/pr-subscribers-lldb
@llvm/pr-subscribers-backend-arm
@llvm/pr-subscribers-backend-systemz
@llvm/pr-subscribers-clangd
@llvm/pr-subscribers-backend-hexagon
@llvm/pr-subscribers-backend-powerpc
@llvm/pr-subscribers-backend-x86
@llvm/pr-subscribers-backend-spir-v
@llvm/pr-subscribers-backend-risc-v
@llvm/pr-subscribers-llvm-mc
@llvm/pr-subscribers-backend-mips
@llvm/pr-subscribers-backend-loongarch
@llvm/pr-subscribers-backend-aarch64
@llvm/pr-subscribers-clang-driver

@llvm/pr-subscribers-clang-tools-extra

Author: Naveen Seth Hanig (naveen-seth)

Changes

The goal of this change is to remove dependencies on the Driver.

This is part of a larger effort to support driver-managed builds for compilations using C++ named modules and/or Clang modules.
It is required to eventually allow linking the dependency scanning tooling against the Driver without creating cyclic dependencies, which would cause build failures when dynamic linking is enabled.

This PR is motivated by the following review comment: #152770 (comment)


Patch is 181.82 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/163659.diff

114 Files Affected:

  • (modified) clang-tools-extra/clangd/CMakeLists.txt (+1)
  • (modified) clang-tools-extra/clangd/CompileCommands.cpp (+13-13)
  • (modified) clang-tools-extra/modularize/CMakeLists.txt (+1)
  • (modified) clang-tools-extra/modularize/CoverageChecker.cpp (+3-3)
  • (modified) clang-tools-extra/modularize/Modularize.cpp (+2-2)
  • (modified) clang-tools-extra/modularize/ModularizeUtilities.cpp (+3-3)
  • (modified) clang-tools-extra/pp-trace/CMakeLists.txt (+1)
  • (modified) clang-tools-extra/pp-trace/PPTrace.cpp (+1-1)
  • (modified) clang/docs/InternalsManual.rst (+4-4)
  • (modified) clang/include/clang/CMakeLists.txt (+1-1)
  • (modified) clang/include/clang/Driver/Driver.h (+1-1)
  • (modified) clang/include/clang/Frontend/Utils.h (+1-1)
  • (renamed) clang/include/clang/Options/CMakeLists.txt ()
  • (renamed) clang/include/clang/Options/ClangOptionDocs.td (+1-1)
  • (renamed) clang/include/clang/Options/OptionUtils.h (+3-3)
  • (renamed) clang/include/clang/Options/Options.h (+8-10)
  • (renamed) clang/include/clang/Options/Options.td ()
  • (modified) clang/lib/CMakeLists.txt (+1)
  • (modified) clang/lib/Driver/CMakeLists.txt (+1-2)
  • (modified) clang/lib/Driver/Compilation.cpp (+1-1)
  • (modified) clang/lib/Driver/Driver.cpp (+1-1)
  • (modified) clang/lib/Driver/SanitizerArgs.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChain.cpp (+3-3)
  • (modified) clang/lib/Driver/ToolChains/AIX.cpp (+3-2)
  • (modified) clang/lib/Driver/ToolChains/AMDGPU.cpp (+9-9)
  • (modified) clang/lib/Driver/ToolChains/AMDGPU.h (+1-1)
  • (modified) clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChains/AVR.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChains/Arch/AArch64.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/Arch/ARM.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/Arch/CSKY.cpp (+3-3)
  • (modified) clang/lib/Driver/ToolChains/Arch/LoongArch.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/Arch/M68k.cpp (+8-8)
  • (modified) clang/lib/Driver/ToolChains/Arch/Mips.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/Arch/PPC.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChains/Arch/RISCV.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChains/Arch/Sparc.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/Arch/SystemZ.cpp (+4-4)
  • (modified) clang/lib/Driver/ToolChains/Arch/VE.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChains/Arch/X86.cpp (+9-9)
  • (modified) clang/lib/Driver/ToolChains/BareMetal.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/CSKYToolChain.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChains/Clang.cpp (+6-6)
  • (modified) clang/lib/Driver/ToolChains/CommonArgs.cpp (+10-10)
  • (modified) clang/lib/Driver/ToolChains/CrossWindows.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChains/Cuda.cpp (+4-4)
  • (modified) clang/lib/Driver/ToolChains/Cygwin.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/Darwin.cpp (+3-3)
  • (modified) clang/lib/Driver/ToolChains/DragonFly.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/Flang.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/FreeBSD.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/Fuchsia.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/Gnu.cpp (+4-4)
  • (modified) clang/lib/Driver/ToolChains/HIPAMD.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChains/HIPSPV.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/HIPUtility.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChains/Hexagon.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChains/Hurd.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/Linux.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/MSP430.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChains/MSVC.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChains/Managarm.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/MinGW.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChains/MipsLinux.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/NetBSD.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/OHOS.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/OpenBSD.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/PPCFreeBSD.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/PPCLinux.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/PS4CPU.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChains/SPIRV.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChains/SYCL.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChains/Solaris.cpp (+2-2)
  • (modified) clang/lib/Driver/ToolChains/UEFI.cpp (+1-1)
  • (modified) clang/lib/Driver/ToolChains/VEToolchain.cpp (+3-3)
  • (modified) clang/lib/Driver/ToolChains/WebAssembly.cpp (+3-3)
  • (modified) clang/lib/Driver/ToolChains/XCore.cpp (+3-3)
  • (modified) clang/lib/Driver/ToolChains/ZOS.cpp (+1-1)
  • (modified) clang/lib/Driver/XRayArgs.cpp (+1-1)
  • (modified) clang/lib/Frontend/CMakeLists.txt (+1)
  • (modified) clang/lib/Frontend/CompilerInvocation.cpp (+27-27)
  • (modified) clang/lib/Frontend/CreateInvocationFromCommandLine.cpp (+3-3)
  • (modified) clang/lib/FrontendTool/CMakeLists.txt (+1)
  • (modified) clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp (+3-3)
  • (modified) clang/lib/Interpreter/Interpreter.cpp (+2-2)
  • (modified) clang/lib/Interpreter/InterpreterUtils.h (+1-1)
  • (added) clang/lib/Options/CMakeLists.txt (+18)
  • (renamed) clang/lib/Options/DriverOptions.cpp (+9-10)
  • (renamed) clang/lib/Options/OptionUtils.cpp (+1-1)
  • (modified) clang/lib/Tooling/CMakeLists.txt (+1)
  • (modified) clang/lib/Tooling/InterpolatingCompilationDatabase.cpp (+6-6)
  • (modified) clang/lib/Tooling/Tooling.cpp (+5-5)
  • (modified) clang/tools/clang-check/CMakeLists.txt (+1)
  • (modified) clang/tools/clang-check/ClangCheck.cpp (+2-2)
  • (modified) clang/tools/clang-installapi/CMakeLists.txt (+1)
  • (modified) clang/tools/clang-installapi/ClangInstallAPI.cpp (+2-2)
  • (modified) clang/tools/clang-installapi/Options.cpp (+24-26)
  • (modified) clang/tools/driver/CMakeLists.txt (+1)
  • (modified) clang/tools/driver/cc1_main.cpp (+1-1)
  • (modified) clang/tools/driver/cc1as_main.cpp (+3-4)
  • (modified) clang/tools/driver/driver.cpp (+1-1)
  • (modified) clang/unittests/Driver/DXCModeTest.cpp (+1-1)
  • (modified) clang/www/OpenProjects.html (+1-1)
  • (modified) flang/docs/FlangDriver.md (+4-4)
  • (modified) flang/lib/Frontend/CMakeLists.txt (+1)
  • (modified) flang/lib/Frontend/CompilerInvocation.cpp (+228-228)
  • (modified) flang/lib/FrontendTool/CMakeLists.txt (+1)
  • (modified) flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp (+3-3)
  • (modified) flang/tools/flang-driver/CMakeLists.txt (+1)
  • (modified) flang/tools/flang-driver/driver.cpp (+2-2)
  • (modified) lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp (+2-2)
  • (modified) llvm/include/llvm/MC/MCAsmInfo.h (+1-1)
  • (modified) llvm/include/llvm/Option/Arg.h (+1-1)
  • (modified) utils/bazel/llvm-project-overlay/clang/BUILD.bazel (+2-2)
diff --git a/clang-tools-extra/clangd/CMakeLists.txt b/clang-tools-extra/clangd/CMakeLists.txt
index fb3f05329be21..d7ec853af862f 100644
--- a/clang-tools-extra/clangd/CMakeLists.txt
+++ b/clang-tools-extra/clangd/CMakeLists.txt
@@ -165,6 +165,7 @@ clang_target_link_libraries(clangDaemon
   clangBasic
   clangDependencyScanning
   clangDriver
+  clangOptions
   clangFormat
   clangFrontend
   clangIndex
diff --git a/clang-tools-extra/clangd/CompileCommands.cpp b/clang-tools-extra/clangd/CompileCommands.cpp
index c1be93730129a..f5592b60a817a 100644
--- a/clang-tools-extra/clangd/CompileCommands.cpp
+++ b/clang-tools-extra/clangd/CompileCommands.cpp
@@ -11,8 +11,8 @@
 #include "support/Logger.h"
 #include "support/Trace.h"
 #include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
 #include "clang/Frontend/CompilerInvocation.h"
+#include "clang/Options/Options.h"
 #include "clang/Tooling/CompilationDatabase.h"
 #include "clang/Tooling/Tooling.h"
 #include "llvm/ADT/ArrayRef.h"
@@ -206,7 +206,7 @@ void CommandMangler::operator()(tooling::CompileCommand &Command,
   if (Cmd.empty())
     return;
 
-  auto &OptTable = clang::driver::getDriverOptTable();
+  auto &OptTable = getDriverOptTable();
   // OriginalArgs needs to outlive ArgList.
   llvm::SmallVector<const char *, 16> OriginalArgs;
   OriginalArgs.reserve(Cmd.size());
@@ -222,8 +222,8 @@ void CommandMangler::operator()(tooling::CompileCommand &Command,
   llvm::opt::InputArgList ArgList;
   ArgList = OptTable.ParseArgs(
       llvm::ArrayRef(OriginalArgs).drop_front(), IgnoredCount, IgnoredCount,
-      llvm::opt::Visibility(IsCLMode ? driver::options::CLOption
-                                     : driver::options::ClangOption));
+      llvm::opt::Visibility(IsCLMode ? options::CLOption
+                                     : options::ClangOption));
 
   llvm::SmallVector<unsigned, 1> IndicesToDrop;
   // Having multiple architecture options (e.g. when building fat binaries)
@@ -232,7 +232,7 @@ void CommandMangler::operator()(tooling::CompileCommand &Command,
   // As there are no signals to figure out which one user actually wants. They
   // can explicitly specify one through `CompileFlags.Add` if need be.
   unsigned ArchOptCount = 0;
-  for (auto *Input : ArgList.filtered(driver::options::OPT_arch)) {
+  for (auto *Input : ArgList.filtered(options::OPT_arch)) {
     ++ArchOptCount;
     for (auto I = 0U; I <= Input->getNumValues(); ++I)
       IndicesToDrop.push_back(Input->getIndex() + I);
@@ -262,13 +262,13 @@ void CommandMangler::operator()(tooling::CompileCommand &Command,
   // explicitly at the end of the flags. This ensures modifications done in the
   // following steps apply in more cases (like setting -x, which only affects
   // inputs that come after it).
-  for (auto *Input : ArgList.filtered(driver::options::OPT_INPUT)) {
+  for (auto *Input : ArgList.filtered(options::OPT_INPUT)) {
     SawInput(Input->getValue(0));
     IndicesToDrop.push_back(Input->getIndex());
   }
   // Anything after `--` is also treated as input, drop them as well.
   if (auto *DashDash =
-          ArgList.getLastArgNoClaim(driver::options::OPT__DASH_DASH)) {
+          ArgList.getLastArgNoClaim(options::OPT__DASH_DASH)) {
     auto DashDashIndex = DashDash->getIndex() + 1; // +1 accounts for Cmd[0]
     // Another +1 so we don't treat the `--` itself as an input.
     for (unsigned I = DashDashIndex + 1; I < Cmd.size(); ++I)
@@ -424,11 +424,11 @@ DriverMode getDriverMode(const std::vector<std::string> &Args) {
 // Returns the set of DriverModes where an option may be used.
 unsigned char getModes(const llvm::opt::Option &Opt) {
   unsigned char Result = DM_None;
-  if (Opt.hasVisibilityFlag(driver::options::ClangOption))
+  if (Opt.hasVisibilityFlag(options::ClangOption))
     Result |= DM_GCC;
-  if (Opt.hasVisibilityFlag(driver::options::CC1Option))
+  if (Opt.hasVisibilityFlag(options::CC1Option))
     Result |= DM_CC1;
-  if (Opt.hasVisibilityFlag(driver::options::CLOption))
+  if (Opt.hasVisibilityFlag(options::CLOption))
     Result |= DM_CL;
   return Result;
 }
@@ -442,8 +442,8 @@ llvm::ArrayRef<ArgStripper::Rule> ArgStripper::rulesFor(llvm::StringRef Arg) {
   using TableTy =
       llvm::StringMap<llvm::SmallVector<Rule, 4>, llvm::BumpPtrAllocator>;
   static TableTy *Table = [] {
-    auto &DriverTable = driver::getDriverOptTable();
-    using DriverID = clang::driver::options::ID;
+    auto &DriverTable = getDriverOptTable();
+    using DriverID = clang::options::ID;
 
     // Collect sets of aliases, so we can treat -foo and -foo= as synonyms.
     // Conceptually a double-linked list: PrevAlias[I] -> I -> NextAlias[I].
@@ -468,7 +468,7 @@ llvm::ArrayRef<ArgStripper::Rule> ArgStripper::rulesFor(llvm::StringRef Arg) {
                FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS,       \
                METAVAR, VALUES, SUBCOMMANDIDS_OFFSET)                          \
   {DriverID::OPT_##ID, DriverID::OPT_##ALIAS, ALIASARGS},
-#include "clang/Driver/Options.inc"
+#include "clang/Options/Options.inc"
 #undef OPTION
     };
     for (auto &E : AliasTable)
diff --git a/clang-tools-extra/modularize/CMakeLists.txt b/clang-tools-extra/modularize/CMakeLists.txt
index eb5383c3ad44e..a775b790a3147 100644
--- a/clang-tools-extra/modularize/CMakeLists.txt
+++ b/clang-tools-extra/modularize/CMakeLists.txt
@@ -20,6 +20,7 @@ clang_target_link_libraries(modularize
   clangAST
   clangBasic
   clangDriver
+  clangOptions
   clangFrontend
   clangLex
   clangSerialization
diff --git a/clang-tools-extra/modularize/CoverageChecker.cpp b/clang-tools-extra/modularize/CoverageChecker.cpp
index 1345a6ef8f489..d80d78c64c6e2 100644
--- a/clang-tools-extra/modularize/CoverageChecker.cpp
+++ b/clang-tools-extra/modularize/CoverageChecker.cpp
@@ -50,18 +50,18 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "CoverageChecker.h"
 #include "ModularizeUtilities.h"
 #include "clang/AST/ASTConsumer.h"
-#include "CoverageChecker.h"
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/RecursiveASTVisitor.h"
 #include "clang/Basic/SourceManager.h"
-#include "clang/Driver/Options.h"
 #include "clang/Frontend/CompilerInstance.h"
 #include "clang/Frontend/FrontendAction.h"
 #include "clang/Frontend/FrontendActions.h"
 #include "clang/Lex/PPCallbacks.h"
 #include "clang/Lex/Preprocessor.h"
+#include "clang/Options/Options.h"
 #include "clang/Tooling/CompilationDatabase.h"
 #include "clang/Tooling/Tooling.h"
 #include "llvm/Option/Option.h"
@@ -73,7 +73,7 @@
 using namespace Modularize;
 using namespace clang;
 using namespace clang::driver;
-using namespace clang::driver::options;
+using namespace clang::options;
 using namespace clang::tooling;
 namespace cl = llvm::cl;
 namespace sys = llvm::sys;
diff --git a/clang-tools-extra/modularize/Modularize.cpp b/clang-tools-extra/modularize/Modularize.cpp
index 376ad0c7875bf..33966b44f719a 100644
--- a/clang-tools-extra/modularize/Modularize.cpp
+++ b/clang-tools-extra/modularize/Modularize.cpp
@@ -231,11 +231,11 @@
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/RecursiveASTVisitor.h"
 #include "clang/Basic/SourceManager.h"
-#include "clang/Driver/Options.h"
 #include "clang/Frontend/CompilerInstance.h"
 #include "clang/Frontend/FrontendAction.h"
 #include "clang/Frontend/FrontendActions.h"
 #include "clang/Lex/Preprocessor.h"
+#include "clang/Options/Options.h"
 #include "clang/Tooling/CompilationDatabase.h"
 #include "clang/Tooling/Tooling.h"
 #include "llvm/Option/Arg.h"
@@ -254,7 +254,7 @@
 
 using namespace clang;
 using namespace clang::driver;
-using namespace clang::driver::options;
+using namespace clang::options;
 using namespace clang::tooling;
 using namespace llvm;
 using namespace llvm::opt;
diff --git a/clang-tools-extra/modularize/ModularizeUtilities.cpp b/clang-tools-extra/modularize/ModularizeUtilities.cpp
index 4dd84feac5df4..6978a6b2fe1b7 100644
--- a/clang-tools-extra/modularize/ModularizeUtilities.cpp
+++ b/clang-tools-extra/modularize/ModularizeUtilities.cpp
@@ -12,17 +12,17 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "ModularizeUtilities.h"
+#include "CoverageChecker.h"
 #include "clang/Basic/SourceManager.h"
-#include "clang/Driver/Options.h"
 #include "clang/Frontend/CompilerInstance.h"
 #include "clang/Frontend/FrontendActions.h"
-#include "CoverageChecker.h"
+#include "clang/Options/Options.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/Support/FileUtilities.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/raw_ostream.h"
-#include "ModularizeUtilities.h"
 
 using namespace clang;
 using namespace llvm;
diff --git a/clang-tools-extra/pp-trace/CMakeLists.txt b/clang-tools-extra/pp-trace/CMakeLists.txt
index 1323adbc35269..da36582ee0234 100644
--- a/clang-tools-extra/pp-trace/CMakeLists.txt
+++ b/clang-tools-extra/pp-trace/CMakeLists.txt
@@ -14,6 +14,7 @@ clang_target_link_libraries(pp-trace
   PRIVATE
   clangAST
   clangBasic
+  clangOptions
   clangFrontend
   clangLex
   clangSerialization
diff --git a/clang-tools-extra/pp-trace/PPTrace.cpp b/clang-tools-extra/pp-trace/PPTrace.cpp
index 0b078c49a55b7..ba5a06a26830d 100644
--- a/clang-tools-extra/pp-trace/PPTrace.cpp
+++ b/clang-tools-extra/pp-trace/PPTrace.cpp
@@ -28,11 +28,11 @@
 #include "clang/AST/ASTConsumer.h"
 #include "clang/AST/ASTContext.h"
 #include "clang/Basic/SourceManager.h"
-#include "clang/Driver/Options.h"
 #include "clang/Frontend/CompilerInstance.h"
 #include "clang/Frontend/FrontendAction.h"
 #include "clang/Frontend/FrontendActions.h"
 #include "clang/Lex/Preprocessor.h"
+#include "clang/Options/Options.h"
 #include "clang/Tooling/Execution.h"
 #include "clang/Tooling/Tooling.h"
 #include "llvm/Option/Arg.h"
diff --git a/clang/docs/InternalsManual.rst b/clang/docs/InternalsManual.rst
index c677ddfa5ecc1..c77259f6122cd 100644
--- a/clang/docs/InternalsManual.rst
+++ b/clang/docs/InternalsManual.rst
@@ -667,7 +667,7 @@ Command Line Interface
 ----------------------
 
 The command line interface of the Clang ``-cc1`` frontend is defined alongside
-the driver options in ``clang/Driver/Options.td``. The information making up an
+the driver options in ``clang/Options/Options.td``. The information making up an
 option definition includes its prefix and name (for example ``-std=``), form and
 position of the option value, help text, aliases and more. Each option may
 belong to a certain group and can be marked with zero or more flags. Options
@@ -712,7 +712,7 @@ variable for the option value:
     }
 
 Next, declare the command line interface of the option in the tablegen file
-``clang/include/clang/Driver/Options.td``. This is done by instantiating the
+``clang/include/clang/Options/Options.td``. This is done by instantiating the
 ``Option`` class (defined in ``llvm/include/llvm/Option/OptParser.td``). The
 instance is typically created through one of the helper classes that encode the
 acceptable ways to specify the option value on the command line:
@@ -906,7 +906,7 @@ command line:
                                   SHOULD_PARSE, KEYPATH, DEFAULT_VALUE,          \
                                   IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER,      \
                                   MERGER, TABLE_INDEX)
-  #include "clang/Driver/Options.inc"
+  #include "clang/Options/Options.inc"
   #undef LANG_OPTION_WITH_MARSHALLING
 
     // ...
@@ -925,7 +925,7 @@ command line:
     GENERATE_OPTION_WITH_MARSHALLING(                                            \
         Args, SA, KIND, FLAGS, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE,    \
         IMPLIED_CHECK, IMPLIED_VALUE, DENORMALIZER, EXTRACTOR, TABLE_INDEX)
-  #include "clang/Driver/Options.inc"
+  #include "clang/Options/Options.inc"
   #undef LANG_OPTION_WITH_MARSHALLING
 
     // ...
diff --git a/clang/include/clang/CMakeLists.txt b/clang/include/clang/CMakeLists.txt
index 47ac70cd21690..77a44e4c48de5 100644
--- a/clang/include/clang/CMakeLists.txt
+++ b/clang/include/clang/CMakeLists.txt
@@ -3,7 +3,7 @@ add_subdirectory(Basic)
 if(CLANG_ENABLE_CIR)
   add_subdirectory(CIR)
 endif()
-add_subdirectory(Driver)
+add_subdirectory(Options)
 add_subdirectory(Parse)
 add_subdirectory(Sema)
 add_subdirectory(Serialization)
diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h
index b9b187ada8add..aa86bffb802a4 100644
--- a/clang/include/clang/Driver/Driver.h
+++ b/clang/include/clang/Driver/Driver.h
@@ -15,11 +15,11 @@
 #include "clang/Driver/Action.h"
 #include "clang/Driver/DriverDiagnostic.h"
 #include "clang/Driver/InputInfo.h"
-#include "clang/Driver/Options.h"
 #include "clang/Driver/Phases.h"
 #include "clang/Driver/ToolChain.h"
 #include "clang/Driver/Types.h"
 #include "clang/Driver/Util.h"
+#include "clang/Options/Options.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/STLFunctionalExtras.h"
 #include "llvm/ADT/StringMap.h"
diff --git a/clang/include/clang/Frontend/Utils.h b/clang/include/clang/Frontend/Utils.h
index 49fd920d1ec43..6961b8a234d18 100644
--- a/clang/include/clang/Frontend/Utils.h
+++ b/clang/include/clang/Frontend/Utils.h
@@ -15,7 +15,7 @@
 
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/LLVM.h"
-#include "clang/Driver/OptionUtils.h"
+#include "clang/Options/OptionUtils.h"
 #include "clang/Frontend/DependencyOutputOptions.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/IntrusiveRefCntPtr.h"
diff --git a/clang/include/clang/Driver/CMakeLists.txt b/clang/include/clang/Options/CMakeLists.txt
similarity index 100%
rename from clang/include/clang/Driver/CMakeLists.txt
rename to clang/include/clang/Options/CMakeLists.txt
diff --git a/clang/include/clang/Driver/ClangOptionDocs.td b/clang/include/clang/Options/ClangOptionDocs.td
similarity index 98%
rename from clang/include/clang/Driver/ClangOptionDocs.td
rename to clang/include/clang/Options/ClangOptionDocs.td
index dea6a7ccb12c9..c4da07306eb8e 100644
--- a/clang/include/clang/Driver/ClangOptionDocs.td
+++ b/clang/include/clang/Options/ClangOptionDocs.td
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 def GlobalDocumentation {
-  code Intro =[{..
+  code Intro = [{..
   -------------------------------------------------------------------
   NOTE: This file is automatically generated by running clang-tblgen
   -gen-opt-docs. Do not edit this file by hand!!
diff --git a/clang/include/clang/Driver/OptionUtils.h b/clang/include/clang/Options/OptionUtils.h
similarity index 94%
rename from clang/include/clang/Driver/OptionUtils.h
rename to clang/include/clang/Options/OptionUtils.h
index 922f536bf33ea..9b5312eb63fcb 100644
--- a/clang/include/clang/Driver/OptionUtils.h
+++ b/clang/include/clang/Options/OptionUtils.h
@@ -10,8 +10,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef LLVM_CLANG_DRIVER_OPTIONUTILS_H
-#define LLVM_CLANG_DRIVER_OPTIONUTILS_H
+#ifndef LLVM_CLANG_OPTIONUTILS_H
+#define LLVM_CLANG_OPTIONUTILS_H
 
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/LLVM.h"
@@ -55,4 +55,4 @@ inline uint64_t getLastArgUInt64Value(const llvm::opt::ArgList &Args,
 
 } // namespace clang
 
-#endif // LLVM_CLANG_DRIVER_OPTIONUTILS_H
+#endif // LLVM_CLANG_OPTIONUTILS_H
diff --git a/clang/include/clang/Driver/Options.h b/clang/include/clang/Options/Options.h
similarity index 86%
rename from clang/include/clang/Driver/Options.h
rename to clang/include/clang/Options/Options.h
index 0797410e9940e..1097845b6e108 100644
--- a/clang/include/clang/Driver/Options.h
+++ b/clang/include/clang/Options/Options.h
@@ -6,14 +6,13 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef LLVM_CLANG_DRIVER_OPTIONS_H
-#define LLVM_CLANG_DRIVER_OPTIONS_H
+#ifndef LLVM_CLANG_OPTIONS_H
+#define LLVM_CLANG_OPTIONS_H
 
 #include "llvm/Option/OptTable.h"
 #include "llvm/Option/Option.h"
 
 namespace clang {
-namespace driver {
 
 namespace options {
 /// Flags specifically for clang options.  Must not overlap with
@@ -42,16 +41,15 @@ enum ClangVisibility {
 };
 
 enum ID {
-    OPT_INVALID = 0, // This is not an option ID.
+  OPT_INVALID = 0, // This is not an option ID.
 #define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__),
-#include "clang/Driver/Options.inc"
-    LastOption
+#include "clang/Options/Options.inc"
+  LastOption
 #undef OPTION
-  };
-}
+};
+} // namespace options
 
 const llvm::opt::OptTable &getDriverOptTable();
-}
-}
+} // namespace clang
 
 #endif
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Options/Options.td
similarity index 100%
rename from clang/include/clang/Driver/Options.td
rename to clang/include/clang/Options/Options.td
diff --git a/clang/lib/CMakeLists.txt b/clang/lib/CMakeLists.txt
index 4f2218b583e41..e90b009da606a 100644
--- a/clang/lib/CMakeLists.txt
+++ b/clang/lib/CMakeLists.txt
@@ -13,6 +13,7 @@ add_subdirectory(Edit)
 add_subdirectory(ExtractAPI)
 add_subdirectory(Rewrite)
 add_subdirectory(Driver)
+add_subdirectory(Options)
 add_subdirectory(Serialization)
 add_subdirectory(Frontend)
 add_subdirectory(FrontendTool)
diff --git a/clang/lib/Driver/CMakeLists.txt b/clang/lib/Driver/CMakeLists.txt
index 7c4f70b966c48..8052659e9836b 100644
--- a/clang/lib/Driver/CMakeLists.txt
+++ b/clang/lib/Driver/CMakeLists.txt
@@ -19,12 +19,10 @@ add_clang_library(clangDriver
   Compilation.cpp
   Distro.cpp
   Driver.cpp
-  DriverOptions.cpp
   Job.cpp
   Multilib.cpp
   MultilibBuilder.cpp
   OffloadBundler.cpp
-  OptionUtils.cpp
   Phases.cpp
   SanitizerArgs.cpp
   Tool.cpp
@@ -99,5 +97,6 @@ add_clang_library(clangDriver
   LINK_LIBS
   clangBasic
   clangLex
+  clangOptions
   ${system_libs}
   )
diff --git a/clang/lib/Driver/Compilation.cpp b/clang/lib/Driver/Compilation.cpp
index 4e300316ae9ba..f8ca2a3d09407 100644
--- a/clang/lib/Driver/Compilation.cpp
+++ b/clang/lib/Driver/Compilation.cpp
@@ -11,9 +11,9 @@
 #include "clang/Driver/Action.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/Job.h"
-#include "clang/Driver/Options.h"
 #include "clang/Driver/ToolChain.h"
 #include "clang/Driver/Util.h"
+#include "clang/Options/Options.h"
 #include "llvm/Option/ArgList.h"
 #include "llvm/Option/OptSpecifier.h"
 #include "llvm/Option/Option.h"
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 40ea513e85427..d6c2aa8027ba3 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -60,13 +60,13 @@
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/InputInfo.h"
 #include "clang/Driver/Job.h"
-#include "clang/Driver/Options.h"
 #include "clang/Driver/Phases.h"
 #include "clang/Driver/SanitizerArgs.h"
 #include "clang/Driver/Tool.h"
 #include "clang/Driver/ToolChain.h"
 #include "clang/Driver/Types.h"
 #include "clang/Lex/DependencyDirectivesScanner.h"
+#include "clang/Options/Options.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SmallSet.h"
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index 5dd48f53b9069..420c4cddbc8dd 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -8,8 +8,8 @@
 #include "clang/Driver/SanitizerArgs.h"
 #include "clang/Basic/Sanitizers.h"
 #include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
 #include "clang/Driver/ToolChain.h"
+#include "clang/Options/Options.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringSwitch.h"
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 3d5cac62afe01..7c77870223449 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -21,9 +21,9 @@
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/InputInfo.h"
 #include "clang/Driver/Job.h"
-#include "clang/Driver/Options.h"
 #include "clang/Driver/SanitizerArgs.h"
 #include "clang/Driver/XRayArgs.h"
+#include "clang/Options/Options.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringRef.h"
@@ -338,7 +338,7 @@ static void getRISCVMultilibFlags(const Driver &D, const llvm::Triple &Triple,
 
 Multilib::flags_list
 ToolChain::getMultilibFlags(const llvm::opt::ArgList &Args) const {
-  using namespace clang::driver::options;
+  using namespace clang::option...
[truncated]

@AaronBallman
Copy link
Collaborator

Hi, is this PR ready to merge? It has approvals from the Clang driver and options maintainers, and the follow-up PR (#165277), which includes this patch, has approval from Flang driver maintainer @tarunprabhu (can you confirm if that also applies to this patch?).

I’m happy to wait a bit longer for any additional feedback on the RFC. Before merging, I’ll also retest the build locally with BUILD_SHARED_LIBS=ON (on Linux) for clang, clang-tools-extra, flang and lldb.

Thanks everyone for reviewing!!

I think it's almost ready to merge; I'd say we should give the RFC another two (or more) days so folks have a chance to weigh in with any concerns (downstream folks sometimes take a little bit longer to respond to RFCs). I would say if there are no negative comments by Friday, I'll accept the RFC and we should be fine to land.

Copy link
Contributor

@tarunprabhu tarunprabhu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The flang parts of this LGTM.

@naveen-seth naveen-seth force-pushed the clangOptions branch 2 times, most recently from 88143ae to a4d7357 Compare November 7, 2025 15:57
…NFC)

This change moves option-related code from clangDriver into a new
clangOptions library.

This refactoring is part of a broader effort to support driver-managed
builds for compilations using C++ named modules and/or Clang modules.
It is required for linking the dependency scanning tooling against the
driver without introducing cyclic dependencies, which would otherwise
cause build failures when dynamic linking is enabled.
In particular, clangFrontend must no longer depend on clangDriver for
this to be possible.

This PR is motivated by the following review comment:
llvm#152770 (comment)
@naveen-seth
Copy link
Contributor Author

I would say if there are no negative comments by Friday, I'll accept the RFC and we should be fine to land.

Hi @AaronBallman, I wasn't sure if I was supposed to merge after Friday if there were no negative comments (without an explicit approval). Just wanted to confirm and thanks again.

Copy link
Collaborator

@AaronBallman AaronBallman left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@naveen-seth naveen-seth merged commit 9a783b6 into llvm:main Nov 10, 2025
13 checks passed
@npanchen
Copy link
Contributor

@naveen-seth there's still a reference to Options.h in https://github.com/llvm/llvm-project/blob/main/clang/include/clang/Driver/Driver.h#L22 that makes clang unbuildable

@naveen-seth
Copy link
Contributor Author

Thank you. Reverting now.

naveen-seth added a commit that referenced this pull request Nov 10, 2025
…w clangOptions library" (#167348)

Reverts #163659 due to missing one reference clang/Driver/Options.h in 
clang/include/clang/Driver/Driver.h.

See #163659 (comment)
llvm-sync bot pushed a commit to arm/arm-toolchain that referenced this pull request Nov 10, 2025
…ver into new clangOptions library" (#167348)

Reverts #163659 due to missing one reference clang/Driver/Options.h in
clang/include/clang/Driver/Driver.h.

See llvm/llvm-project#163659 (comment)
Comment on lines -18 to 23
#include "clang/Driver/Options.h"
#include "clang/Driver/Phases.h"
#include "clang/Driver/ToolChain.h"
#include "clang/Driver/Types.h"
#include "clang/Driver/Util.h"
#include "clang/Options/Options.h"
#include "llvm/ADT/ArrayRef.h"
Copy link
Contributor Author

@naveen-seth naveen-seth Nov 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@naveen-seth there's still a reference to Options.h in https://github.com/llvm/llvm-project/blob/main/clang/include/clang/Driver/Driver.h#L22 that makes clang unbuildable.

Hmm this is odd. Looking at the git diff here, it should have been removed.
Looking at the revision of the main branch with the landed PR, I can't find any #include/Driver/Options.h either:

#include "clang/Driver/ToolChain.h"
#include "clang/Driver/Types.h"
#include "clang/Driver/Util.h"
#include "clang/Options/Options.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/STLFunctionalExtras.h"
#include "llvm/ADT/StringMap.h"

The pre-commit CI and my local builds (with BUILD_SHARED_LIBS=ON) also went through fine without hitting any related errors. Looking at the post commit CI, I also didn't find the corresponding error.

@npanchen can you point me to where you are seeing the failure?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@npanchen can you point me to where you are seeing the failure?

Pardon, my machine is quite busy with the other work now, but the snapshot of the error I got is:

Compiling clang/lib/Driver/ToolChains/WebAssembly.cpp failed: (Exit 1): multi-platform-clang++.sh failed: error executing CppCompile command (from cc_library rule target @@+llvm_configure+llvm-project//clang:driver) bazel/internal/cc-toolchain/tools/multi-platform
-clang++.sh '--sysroot=external/sysroot-jammy-x86_64+' '-resource-dir=external/+http_archive+clang-linux-x86_64/lib/clang/20' -no-canonical-prefixes ... (remaining 242 arguments skipped)
                                                                                                          
Use --sandbox_debug to see verbose messages from the sandbox and retain the sandbox build root for debugging                                                                                                         
In file included from external/+llvm_configure+llvm-project/clang/lib/Driver/ToolChains/WebAssembly.cpp:9:            
In file included from external/+llvm_configure+llvm-project/clang/lib/Driver/ToolChains/WebAssembly.h:12:                                                                                                            
In file included from external/+llvm_configure+llvm-project/clang/lib/Driver/ToolChains/Gnu.h:12:                                                                                                                    
In file included from external/+llvm_configure+llvm-project/clang/include/clang/Driver/CudaInstallationDetector.h:13:                                            
external/+llvm_configure+llvm-project/clang/include/clang/Driver/Driver.h:22:10: fatal error: 'clang/Options/Options.h' file not found                                                                               
   22 | #include "clang/Options/Options.h"
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~ 

Hmm this is odd. Looking at the git diff here, it should have been removed.

If I look at main state after the PR has been merged (which removed Option.h) , Driver.h:22 does still include Option.h, right ?

Copy link
Contributor Author

@naveen-seth naveen-seth Nov 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If I look at main state after the PR has been merged (which removed Option.h) , Driver.h:22 does still include Option.h, right ?

Options.h was moved from clang/include/clang/Driver/Options.h to clang/include/clang/Options/Options.h in this patch. The #include clang/Options/Options.h should therefore be correct.

external/+llvm_configure+llvm-project/clang/include/clang/Driver/Driver.h:22:10: fatal error: 'clang/Options/Options.h' file not found                                                                               
   22 | #include "clang/Options/Options.h"
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~ 

I think this is a local issue with your checkout or build state. The file clang/Options/Options.h does exist in the revision of main in which this patch landed (see here).
Could you try doing a clean build? That should resolve the issue.

I've created a reland for this here: #167374.
I'll reland it right after you approve it (if it’s indeed a local issue).

naveen-seth added a commit to naveen-seth/llvm-project that referenced this pull request Nov 10, 2025
…w clangOptions library" (llvm#167348)

This relands llvm#167348.

The original PR was reverted due to a reported build failure, which
was  later diagnosed as a local issue in the developer’s checkout or
build state. See discussion here:
llvm#163659 (comment)

No additional changes have been made in this reland.
naveen-seth added a commit that referenced this pull request Nov 10, 2025
…w clangOptions library" (#167374)

This relands #167348.

The original PR was reverted due to a reported build failure, which was
later diagnosed as a local issue in the developer’s checkout or build
state. See discussion here:
#163659 (comment)

No additional changes have been made in this reland.
@naveen-seth naveen-seth deleted the clangOptions branch November 10, 2025 20:42
llvm-sync bot pushed a commit to arm/arm-toolchain that referenced this pull request Nov 10, 2025
…ver into new clangOptions library" (#167374)

This relands #167348.

The original PR was reverted due to a reported build failure, which was
later diagnosed as a local issue in the developer’s checkout or build
state. See discussion here:
llvm/llvm-project#163659 (comment)

No additional changes have been made in this reland.
macurtis-amd pushed a commit to ROCm/llvm-project that referenced this pull request Nov 11, 2025
…w clangOptions library" (llvm#167374)

This relands llvm#167348.

The original PR was reverted due to a reported build failure, which was
later diagnosed as a local issue in the developer’s checkout or build
state. See discussion here:
llvm#163659 (comment)

No additional changes have been made in this reland.

(cherry picked from commit f63d33d)
macurtis-amd pushed a commit to ROCm/llvm-project that referenced this pull request Nov 11, 2025
…w clangOptions library" (llvm#167374)

This relands llvm#167348.

The original PR was reverted due to a reported build failure, which was
later diagnosed as a local issue in the developer’s checkout or build
state. See discussion here:
llvm#163659 (comment)

No additional changes have been made in this reland.

(cherry picked from commit f63d33d)
ronlieb pushed a commit to ROCm/llvm-project that referenced this pull request Nov 11, 2025
…w clangOptions library" (llvm#167374)

This relands llvm#167348.

The original PR was reverted due to a reported build failure, which was
later diagnosed as a local issue in the developer’s checkout or build
state. See discussion here:
llvm#163659 (comment)

No additional changes have been made in this reland.

(cherry picked from commit f63d33d)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backend:AArch64 backend:AMDGPU backend:ARM backend:CSKY backend:Hexagon backend:loongarch backend:MIPS backend:PowerPC backend:RISC-V backend:Sparc backend:SPIR-V backend:SystemZ backend:X86 bazel "Peripheral" support tier build system: utils/bazel clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' clang:frontend Language frontend issues, e.g. anything involving "Sema" clang:openmp OpenMP related changes to Clang clang Clang issues not falling into any other category clang-tools-extra clangd flang:driver flang Flang issues not falling into any other category lldb llvm:mc Machine (object) code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants