[flang][driver] Introduce FCC_OVERRIDE_OPTIONS. (#140556)

This PR add functionality to change `flang` command line using
environment variable `FCC_OVERRIDE_OPTIONS`. It is quite similar to what
`CCC_OVERRIDE_OPTIONS` does for clang.

The `FCC_OVERRIDE_OPTIONS` seemed like the most obvious name to me but I
am open to other ideas. The `applyOverrideOptions` now takes an extra
argument that is the name of the environment variable. Previously
`CCC_OVERRIDE_OPTIONS` was hardcoded.
This commit is contained in:
Abid Qadeer
2025-06-02 11:37:26 +01:00
committed by GitHub
parent 1984c7539e
commit de38c4eaf5
7 changed files with 60 additions and 6 deletions

View File

@@ -879,7 +879,7 @@ llvm::Error expandResponseFiles(SmallVectorImpl<const char *> &Args,
/// See applyOneOverrideOption. /// See applyOneOverrideOption.
void applyOverrideOptions(SmallVectorImpl<const char *> &Args, void applyOverrideOptions(SmallVectorImpl<const char *> &Args,
const char *OverrideOpts, const char *OverrideOpts,
llvm::StringSet<> &SavedStrings, llvm::StringSet<> &SavedStrings, StringRef EnvVar,
raw_ostream *OS = nullptr); raw_ostream *OS = nullptr);
} // end namespace driver } // end namespace driver

View File

@@ -7204,9 +7204,10 @@ static const char *GetStableCStr(llvm::StringSet<> &SavedStrings, StringRef S) {
/// ///
/// '#': Silence information about the changes to the command line arguments. /// '#': Silence information about the changes to the command line arguments.
/// ///
/// '^': Add FOO as a new argument at the beginning of the command line. /// '^FOO': Add FOO as a new argument at the beginning of the command line
/// right after the name of the compiler executable.
/// ///
/// '+': Add FOO as a new argument at the end of the command line. /// '+FOO': Add FOO as a new argument at the end of the command line.
/// ///
/// 's/XXX/YYY/': Substitute the regular expression XXX with YYY in the command /// 's/XXX/YYY/': Substitute the regular expression XXX with YYY in the command
/// line. /// line.
@@ -7294,7 +7295,7 @@ static void applyOneOverrideOption(raw_ostream &OS,
void driver::applyOverrideOptions(SmallVectorImpl<const char *> &Args, void driver::applyOverrideOptions(SmallVectorImpl<const char *> &Args,
const char *OverrideStr, const char *OverrideStr,
llvm::StringSet<> &SavedStrings, llvm::StringSet<> &SavedStrings,
raw_ostream *OS) { StringRef EnvVar, raw_ostream *OS) {
if (!OS) if (!OS)
OS = &llvm::nulls(); OS = &llvm::nulls();
@@ -7303,7 +7304,7 @@ void driver::applyOverrideOptions(SmallVectorImpl<const char *> &Args,
OS = &llvm::nulls(); OS = &llvm::nulls();
} }
*OS << "### CCC_OVERRIDE_OPTIONS: " << OverrideStr << "\n"; *OS << "### " << EnvVar << ": " << OverrideStr << "\n";
// This does not need to be efficient. // This does not need to be efficient.

View File

@@ -305,7 +305,7 @@ int clang_main(int Argc, char **Argv, const llvm::ToolContext &ToolContext) {
if (const char *OverrideStr = ::getenv("CCC_OVERRIDE_OPTIONS")) { if (const char *OverrideStr = ::getenv("CCC_OVERRIDE_OPTIONS")) {
// FIXME: Driver shouldn't take extra initial argument. // FIXME: Driver shouldn't take extra initial argument.
driver::applyOverrideOptions(Args, OverrideStr, SavedStrings, driver::applyOverrideOptions(Args, OverrideStr, SavedStrings,
&llvm::errs()); "CCC_OVERRIDE_OPTIONS", &llvm::errs());
} }
std::string Path = GetExecutablePath(ToolContext.Path, CanonicalPrefixes); std::string Path = GetExecutablePath(ToolContext.Path, CanonicalPrefixes);

View File

@@ -614,3 +614,31 @@ nvfortran defines `-fast` as
- `-Mcache_align`: there is no equivalent flag in Flang or Clang. - `-Mcache_align`: there is no equivalent flag in Flang or Clang.
- `-Mflushz`: flush-to-zero mode - when `-ffast-math` is specified, Flang will - `-Mflushz`: flush-to-zero mode - when `-ffast-math` is specified, Flang will
link to `crtfastmath.o` to ensure denormal numbers are flushed to zero. link to `crtfastmath.o` to ensure denormal numbers are flushed to zero.
## FCC_OVERRIDE_OPTIONS
The environment variable `FCC_OVERRIDE_OPTIONS` can be used to edit flang's
command line arguments. The value of this variable is a space-separated list of
edits to perform. The edits are applied in the order in which they appear in
`FCC_OVERRIDE_OPTIONS`. Each edit should be one of the following form:
- `#`: Silence information about the changes to the command line arguments.
- `^FOO`: Add `FOO` as a new argument at the beginning of the command line right
after the name of the compiler executable.
- `+FOO`: Add `FOO` as a new argument at the end of the command line.
- `s/XXX/YYY/`: Substitute the regular expression `XXX` with `YYY` in the
command line.
- `xOPTION`: Removes all instances of the literal argument `OPTION`.
- `XOPTION`: Removes all instances of the literal argument `OPTION`, and the
following argument.
- `Ox`: Removes all flags matching `O` or `O[sz0-9]` and adds `Ox` at the end
of the command line.
This environment variable does not affect the options added by the config files.

View File

@@ -0,0 +1 @@
-Werror

View File

@@ -0,0 +1,17 @@
! RUN: env FCC_OVERRIDE_OPTIONS="#+-Os +-Oz +-O +-O3 +-Oignore +a +b +c xb Xa Omagic ^-### " %flang --target=x86_64-unknown-linux-gnu %s -O2 b -O3 2>&1 | FileCheck %s
! RUN: env FCC_OVERRIDE_OPTIONS="x-Werror +-g" %flang --target=x86_64-unknown-linux-gnu -Werror %s -c -### 2>&1 | FileCheck %s -check-prefix=RM-WERROR
! RUN: env FCC_OVERRIDE_OPTIONS="x-Werror" %flang --config=%S/Inputs/config-7.cfg -### %s -c 2>&1 | FileCheck %s -check-prefix=CONF
! CHECK: "-fc1"
! CHECK-NOT: "-Oignore"
! CHECK: "-Omagic"
! CHECK-NOT: "-Oignore"
! RM-WERROR: ### FCC_OVERRIDE_OPTIONS: x-Werror +-g
! RM-WERROR-NEXT: ### Deleting argument -Werror
! RM-WERROR-NEXT: ### Adding argument -g at end
! RM-WERROR-NOT: "-Werror"
! Test that FCC_OVERRIDE_OPTIONS does not affect the options from config files.
! CONF: ### FCC_OVERRIDE_OPTIONS: x-Werror
! CONF: "-Werror"

View File

@@ -111,6 +111,13 @@ int main(int argc, const char **argv) {
} }
} }
llvm::StringSet<> savedStrings;
// Handle FCC_OVERRIDE_OPTIONS, used for editing a command line behind the
// scenes.
if (const char *overrideStr = ::getenv("FCC_OVERRIDE_OPTIONS"))
clang::driver::applyOverrideOptions(args, overrideStr, savedStrings,
"FCC_OVERRIDE_OPTIONS", &llvm::errs());
// Not in the frontend mode - continue in the compiler driver mode. // Not in the frontend mode - continue in the compiler driver mode.
// Create DiagnosticsEngine for the compiler driver // Create DiagnosticsEngine for the compiler driver