-
Notifications
You must be signed in to change notification settings - Fork 14.5k
[flang][driver] Introduce FCC_OVERRIDE_OPTIONS. #140556
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
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.
@llvm/pr-subscribers-clang @llvm/pr-subscribers-clang-driver Author: Abid Qadeer (abidh) ChangesThis PR add functionality to change The Full diff: https://github.com/llvm/llvm-project/pull/140556.diff 5 Files Affected:
diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h
index b463dc2a93550..7ca848f11b561 100644
--- a/clang/include/clang/Driver/Driver.h
+++ b/clang/include/clang/Driver/Driver.h
@@ -879,7 +879,7 @@ llvm::Error expandResponseFiles(SmallVectorImpl<const char *> &Args,
/// See applyOneOverrideOption.
void applyOverrideOptions(SmallVectorImpl<const char *> &Args,
const char *OverrideOpts,
- llvm::StringSet<> &SavedStrings,
+ llvm::StringSet<> &SavedStrings, StringRef EnvVar,
raw_ostream *OS = nullptr);
} // end namespace driver
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index a648cc928afdc..a8fea35926a0d 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -7289,7 +7289,7 @@ static void applyOneOverrideOption(raw_ostream &OS,
void driver::applyOverrideOptions(SmallVectorImpl<const char *> &Args,
const char *OverrideStr,
llvm::StringSet<> &SavedStrings,
- raw_ostream *OS) {
+ StringRef EnvVar, raw_ostream *OS) {
if (!OS)
OS = &llvm::nulls();
@@ -7298,7 +7298,7 @@ void driver::applyOverrideOptions(SmallVectorImpl<const char *> &Args,
OS = &llvm::nulls();
}
- *OS << "### CCC_OVERRIDE_OPTIONS: " << OverrideStr << "\n";
+ *OS << "### " << EnvVar << ": " << OverrideStr << "\n";
// This does not need to be efficient.
diff --git a/clang/tools/driver/driver.cpp b/clang/tools/driver/driver.cpp
index 82f47ab973064..81964c65c2892 100644
--- a/clang/tools/driver/driver.cpp
+++ b/clang/tools/driver/driver.cpp
@@ -305,7 +305,7 @@ int clang_main(int Argc, char **Argv, const llvm::ToolContext &ToolContext) {
if (const char *OverrideStr = ::getenv("CCC_OVERRIDE_OPTIONS")) {
// FIXME: Driver shouldn't take extra initial argument.
driver::applyOverrideOptions(Args, OverrideStr, SavedStrings,
- &llvm::errs());
+ "CCC_OVERRIDE_OPTIONS", &llvm::errs());
}
std::string Path = GetExecutablePath(ToolContext.Path, CanonicalPrefixes);
diff --git a/flang/test/Driver/fcc_override.f90 b/flang/test/Driver/fcc_override.f90
new file mode 100644
index 0000000000000..55a07803fdde5
--- /dev/null
+++ b/flang/test/Driver/fcc_override.f90
@@ -0,0 +1,12 @@
+! 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
+
+! 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"
diff --git a/flang/tools/flang-driver/driver.cpp b/flang/tools/flang-driver/driver.cpp
index ed52988feaa59..ad0efa3279cef 100644
--- a/flang/tools/flang-driver/driver.cpp
+++ b/flang/tools/flang-driver/driver.cpp
@@ -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.
// Create DiagnosticsEngine for the compiler driver
|
Thanks Abid. Perhaps |
Does If |
flang/test/Driver/fcc_override.f90
Outdated
@@ -0,0 +1,12 @@ | |||
! 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does +
, x
,X
have special meanings? Is that documented anywhere?
I think we should document FCC_OVERRIDE_OPTIONS
. One possible location is https://github.com/llvm/llvm-project/blob/main/flang/docs/FlangDriver.md
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, those have special meaning and they were only documented in the comments. I have now added documentation for it in the suggested file.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
--target=x86_64-unknown-linux-gnu
instead of the long deprecated -target
The |
Maybe we should split the difference and call it |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the changes, Abid. Regarding my suggestions in the documentation, feel free to incorporate or discard them as you see fit.
I'll leave it you and @kiranchandramohan to decide what the name of the environment variable should be.
Other than that, this looks good.
flang/docs/FlangDriver.md
Outdated
The environment variable `FCC_OVERRIDE_OPTIONS` can be used to apply a list of | ||
edits to the input argument lists. The value of this environment variable is | ||
a space separated list of edits to perform. These edits are applied in order to | ||
the input argument lists. Edits should be one of the following forms: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What do you think of this?
The environment variable `FCC_OVERRIDE_OPTIONS` can be used to apply a list of | |
edits to the input argument lists. The value of this environment variable is | |
a space separated list of edits to perform. These edits are applied in order to | |
the input argument lists. Edits should be one of the following forms: | |
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 forms: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks. This looks better than what I had originally. I have updated the docs.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
clang driver code looks good
flang/test/Driver/fcc_override.f90
Outdated
@@ -0,0 +1,12 @@ | |||
! 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
--target=x86_64-unknown-linux-gnu
instead of the long deprecated -target
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM. Thanks.
flang/tools/flang-driver/driver.cpp
Outdated
llvm::StringSet<> SavedStrings; | ||
// Handle FCC_OVERRIDE_OPTIONS, used for editing a command line behind the | ||
// scenes. | ||
if (const char *OverrideStr = ::getenv("FCC_OVERRIDE_OPTIONS")) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if (const char *OverrideStr = ::getenv("FCC_OVERRIDE_OPTIONS")) | |
if (const char *overrideStr = ::getenv("FCC_OVERRIDE_OPTIONS")) |
flang/tools/flang-driver/driver.cpp
Outdated
@@ -111,6 +111,13 @@ int main(int argc, const char **argv) { | |||
} | |||
} | |||
|
|||
llvm::StringSet<> SavedStrings; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
llvm::StringSet<> SavedStrings; | |
llvm::StringSet<> savedStrings; |
flang/test/Driver/fcc_override.f90
Outdated
@@ -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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should this also be --target
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Indeed. Thanks for catching this. Fixed now.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks Abid. LGTM.
flang/docs/FlangDriver.md
Outdated
|
||
- `#`: Silence information about the changes to the command line arguments. | ||
|
||
- `^FOO`: Add `FOO` as a new argument at the beginning of the command line. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For clang a.cc
, this actually adds FOO
after clang
. The comment in clang/lib/Driver/Driver.cpp and this description probably should be made more accurate.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have added "right after the name of the compiler executable" in both places. Hopefully that is enough to make it clear.
@@ -614,3 +614,30 @@ nvfortran defines `-fast` as | |||
- `-Mcache_align`: there is no equivalent flag in Flang or Clang. | |||
- `-Mflushz`: flush-to-zero mode - when `-ffast-math` is specified, Flang will | |||
link to `crtfastmath.o` to ensure denormal numbers are flushed to zero. | |||
|
|||
|
|||
## FCC_OVERRIDE_OPTIONS |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I noticed that clang/docs doesn't have the documentation. Perhaps we should document clang/docs/UsersManual.rst
as well and reference it from FlangDriver.md?
("Each edit should be one of the following forms:" list
should probably reference the clang doc)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I will add clang documentation in a separate PR. The FCC_OVERRIDE_OPTIONS
one can then probably just refer to it.
The test failure in Lower/namelist.f90 was due to |
As was noted in llvm#140556 (comment), there is no documentation for `CCC_OVERRIDE_OPTIONS`. This adds the missing documentation. The information is duplicate of what we have for `FCC_OVERRIDE_OPTIONS` in flang. Once this goes in and available at https://clang.llvm.org/docs/UsersManual.html then the flang documentation can be changed to refer to it.
As was noted in #140556 (comment), there is no documentation for `CCC_OVERRIDE_OPTIONS`. This adds the missing documentation. The information is duplicate of what we have for `FCC_OVERRIDE_OPTIONS` in flang. Once this goes in and available at https://clang.llvm.org/docs/UsersManual.html then the flang documentation can be changed to refer to it.
As was noted in llvm#140556 (comment), there is no documentation for `CCC_OVERRIDE_OPTIONS`. This adds the missing documentation. The information is duplicate of what we have for `FCC_OVERRIDE_OPTIONS` in flang. Once this goes in and available at https://clang.llvm.org/docs/UsersManual.html then the flang documentation can be changed to refer to it.
As was noted in llvm/llvm-project#140556 (comment), there is no documentation for `CCC_OVERRIDE_OPTIONS`. This adds the missing documentation. The information is duplicate of what we have for `FCC_OVERRIDE_OPTIONS` in flang. Once this goes in and available at https://clang.llvm.org/docs/UsersManual.html then the flang documentation can be changed to refer to it.
As was noted in llvm#140556 (comment), there is no documentation for `CCC_OVERRIDE_OPTIONS`. This adds the missing documentation. The information is duplicate of what we have for `FCC_OVERRIDE_OPTIONS` in flang. Once this goes in and available at https://clang.llvm.org/docs/UsersManual.html then the flang documentation can be changed to refer to it.
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.
As was noted in llvm#140556 (comment), there is no documentation for `CCC_OVERRIDE_OPTIONS`. This adds the missing documentation. The information is duplicate of what we have for `FCC_OVERRIDE_OPTIONS` in flang. Once this goes in and available at https://clang.llvm.org/docs/UsersManual.html then the flang documentation can be changed to refer to it.
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 PR add functionality to change
flang
command line using environment variableFCC_OVERRIDE_OPTIONS
. It is quite similar to whatCCC_OVERRIDE_OPTIONS
does for clang.The
FCC_OVERRIDE_OPTIONS
seemed like the most obvious name to me but I am open to other ideas. TheapplyOverrideOptions
now takes an extra argument that is the name of the environment variable. PreviouslyCCC_OVERRIDE_OPTIONS
was hardcoded.