Skip to content

Commit 7e958f6

Browse files
[flang][clang] Add Visibility specific help text for options (#81869)
And use it to print the correct default OpenMP version for flang and flang -fc1. This change adds an optional `HelpTextsForVariants` to options. This allows you to change the help text that gets shown in documentation and `--help` based on the program its being generated for. As `OptTable` needs to be constexpr compatible, I have used a std::array of help text variants. Each entry is: (list of visibilities) - > help text string So for the OpenMP version we have (flang, fc1) -> "OpenMP version for flang is...". So you can have multiple visibilities use the same string. The number of entries is currently set to 1, and the number of visibilities per entry is 2, because that's the maximum we need for now. The code is written so we can increase these numbers later, and the unused elements will be initialised. I have not applied this to group descriptions just because I don't know of one that needs changing. It could easily be enabled for those too if needed. There are minor changes to them just to get it all to compile. This approach of storing many help strings per option in the 1 driver library seemed preferable to making a whole new library for Flang (even if that would mostly be including stuff from Clang).
1 parent 73fa668 commit 7e958f6

File tree

14 files changed

+235
-53
lines changed

14 files changed

+235
-53
lines changed

clang-tools-extra/clangd/CompileCommands.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,8 @@ llvm::ArrayRef<ArgStripper::Rule> ArgStripper::rulesFor(llvm::StringRef Arg) {
466466
static constexpr llvm::ArrayRef<llvm::StringLiteral> NAME( \
467467
NAME##_init, std::size(NAME##_init) - 1);
468468
#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \
469-
FLAGS, VISIBILITY, PARAM, HELP, METAVAR, VALUES) \
469+
FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, \
470+
METAVAR, VALUES) \
470471
Prefixes[DriverID::OPT_##ID] = PREFIX;
471472
#include "clang/Driver/Options.inc"
472473
#undef OPTION
@@ -478,7 +479,8 @@ llvm::ArrayRef<ArgStripper::Rule> ArgStripper::rulesFor(llvm::StringRef Arg) {
478479
const void *AliasArgs;
479480
} AliasTable[] = {
480481
#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \
481-
FLAGS, VISIBILITY, PARAM, HELP, METAVAR, VALUES) \
482+
FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, \
483+
METAVAR, VALUES) \
482484
{DriverID::OPT_##ID, DriverID::OPT_##ALIAS, ALIASARGS},
483485
#include "clang/Driver/Options.inc"
484486
#undef OPTION

clang/include/clang/Driver/Options.td

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3409,10 +3409,16 @@ def fopenmp : Flag<["-"], "fopenmp">, Group<f_Group>,
34093409
HelpText<"Parse OpenMP pragmas and generate parallel code.">;
34103410
def fno_openmp : Flag<["-"], "fno-openmp">, Group<f_Group>,
34113411
Flags<[NoArgumentUnused]>;
3412+
class OpenMPVersionHelp<string program, string default> {
3413+
string str = !strconcat(
3414+
"Set OpenMP version (e.g. 45 for OpenMP 4.5, 51 for OpenMP 5.1). Default value is ",
3415+
default, " for ", program);
3416+
}
34123417
def fopenmp_version_EQ : Joined<["-"], "fopenmp-version=">, Group<f_Group>,
34133418
Flags<[NoArgumentUnused]>,
34143419
Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>,
3415-
HelpText<"Set OpenMP version (e.g. 45 for OpenMP 4.5, 51 for OpenMP 5.1). Default value is 51 for Clang">;
3420+
HelpText<OpenMPVersionHelp<"Clang", "51">.str>,
3421+
HelpTextForVariants<[FlangOption, FC1Option], OpenMPVersionHelp<"Flang", "11">.str>;
34163422
defm openmp_extensions: BoolFOption<"openmp-extensions",
34173423
LangOpts<"OpenMPExtensions">, DefaultTrue,
34183424
PosFlag<SetTrue, [NoArgumentUnused], [ClangOption, CC1Option],

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -533,10 +533,10 @@ static T extractMaskValue(T KeyPath) {
533533

534534
#define PARSE_OPTION_WITH_MARSHALLING( \
535535
ARGS, DIAGS, PREFIX_TYPE, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \
536-
FLAGS, VISIBILITY, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, \
537-
ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, \
538-
NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \
539-
if ((VISIBILITY)&options::CC1Option) { \
536+
FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, METAVAR, VALUES, \
537+
SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, \
538+
IMPLIED_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \
539+
if ((VISIBILITY) & options::CC1Option) { \
540540
KEYPATH = MERGER(KEYPATH, DEFAULT_VALUE); \
541541
if (IMPLIED_CHECK) \
542542
KEYPATH = MERGER(KEYPATH, IMPLIED_VALUE); \
@@ -550,10 +550,10 @@ static T extractMaskValue(T KeyPath) {
550550
// with lifetime extension of the reference.
551551
#define GENERATE_OPTION_WITH_MARSHALLING( \
552552
CONSUMER, PREFIX_TYPE, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \
553-
VISIBILITY, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, \
554-
KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
555-
DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \
556-
if ((VISIBILITY)&options::CC1Option) { \
553+
VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, METAVAR, VALUES, \
554+
SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, \
555+
IMPLIED_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \
556+
if ((VISIBILITY) & options::CC1Option) { \
557557
[&](const auto &Extracted) { \
558558
if (ALWAYS_EMIT || \
559559
(Extracted != \

clang/utils/TableGen/ClangOptionDocEmitter.cpp

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -359,8 +359,38 @@ void emitOption(const DocumentedOption &Option, const Record *DocInfo,
359359

360360
// Emit the description, if we have one.
361361
const Record *R = Option.Option;
362-
std::string Description =
363-
getRSTStringWithTextFallback(R, "DocBrief", "HelpText");
362+
std::string Description;
363+
364+
// Prefer a program specific help string.
365+
// This is a list of (visibilities, string) pairs.
366+
std::vector<Record *> VisibilitiesHelp =
367+
R->getValueAsListOfDefs("HelpTextsForVariants");
368+
for (Record *VisibilityHelp : VisibilitiesHelp) {
369+
// This is a list of visibilities.
370+
ArrayRef<Init *> Visibilities =
371+
VisibilityHelp->getValueAsListInit("Visibilities")->getValues();
372+
373+
// See if any of the program's visibilities are in the list.
374+
for (StringRef DocInfoMask :
375+
DocInfo->getValueAsListOfStrings("VisibilityMask")) {
376+
for (Init *Visibility : Visibilities) {
377+
if (Visibility->getAsUnquotedString() == DocInfoMask) {
378+
// Use the first one we find.
379+
Description = escapeRST(VisibilityHelp->getValueAsString("Text"));
380+
break;
381+
}
382+
}
383+
if (!Description.empty())
384+
break;
385+
}
386+
387+
if (!Description.empty())
388+
break;
389+
}
390+
391+
// If there's not a program specific string, use the default one.
392+
if (Description.empty())
393+
Description = getRSTStringWithTextFallback(R, "DocBrief", "HelpText");
364394

365395
if (!isa<UnsetInit>(R->getValueInit("Values"))) {
366396
if (!Description.empty() && Description.back() != '.')

flang/test/Driver/driver-help-hidden.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@
8181
! CHECK-NEXT: -fopenmp-targets=<value>
8282
! CHECK-NEXT: Specify comma-separated list of triples OpenMP offloading targets to be supported
8383
! CHECK-NEXT: -fopenmp-version=<value>
84-
! CHECK-NEXT: Set OpenMP version (e.g. 45 for OpenMP 4.5, 51 for OpenMP 5.1). Default value is 51 for Clang
84+
! CHECK-NEXT: Set OpenMP version (e.g. 45 for OpenMP 4.5, 51 for OpenMP 5.1). Default value is 11 for Flang
8585
! CHECK-NEXT: -fopenmp Parse OpenMP pragmas and generate parallel code.
8686
! CHECK-NEXT: -foptimization-record-file=<file>
8787
! CHECK-NEXT: Specify the output name of the file containing the optimization remarks. Implies -fsave-optimization-record. On Darwin platforms, this cannot be used with multiple -arch <arch> options.

flang/test/Driver/driver-help.f90

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969
! HELP-NEXT: -fopenmp-targets=<value>
7070
! HELP-NEXT: Specify comma-separated list of triples OpenMP offloading targets to be supported
7171
! HELP-NEXT: -fopenmp-version=<value>
72-
! HELP-NEXT: Set OpenMP version (e.g. 45 for OpenMP 4.5, 51 for OpenMP 5.1). Default value is 51 for Clang
72+
! HELP-NEXT: Set OpenMP version (e.g. 45 for OpenMP 4.5, 51 for OpenMP 5.1). Default value is 11 for Flang
7373
! HELP-NEXT: -fopenmp Parse OpenMP pragmas and generate parallel code.
7474
! HELP-NEXT: -foptimization-record-file=<file>
7575
! HELP-NEXT: Specify the output name of the file containing the optimization remarks. Implies -fsave-optimization-record. On Darwin platforms, this cannot be used with multiple -arch <arch> options.
@@ -226,7 +226,7 @@
226226
! HELP-FC1-NEXT: Generate code only for an OpenMP target device.
227227
! HELP-FC1-NEXT: -fopenmp-target-debug Enable debugging in the OpenMP offloading device RTL
228228
! HELP-FC1-NEXT: -fopenmp-version=<value>
229-
! HELP-FC1-NEXT: Set OpenMP version (e.g. 45 for OpenMP 4.5, 51 for OpenMP 5.1). Default value is 51 for Clang
229+
! HELP-FC1-NEXT: Set OpenMP version (e.g. 45 for OpenMP 4.5, 51 for OpenMP 5.1). Default value is 11 for Flang
230230
! HELP-FC1-NEXT: -fopenmp Parse OpenMP pragmas and generate parallel code.
231231
! HELP-FC1-NEXT: -fpass-plugin=<dsopath> Load pass plugin from a dynamic shared object file (only with new pass manager).
232232
! HELP-FC1-NEXT: -fppc-native-vector-element-order

lld/MachO/DriverUtils.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,21 @@ using namespace lld::macho;
4545
// Create table mapping all options defined in Options.td
4646
static constexpr OptTable::Info optInfo[] = {
4747
#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \
48-
VISIBILITY, PARAM, HELPTEXT, METAVAR, VALUES) \
49-
{PREFIX, NAME, HELPTEXT, \
50-
METAVAR, OPT_##ID, opt::Option::KIND##Class, \
51-
PARAM, FLAGS, VISIBILITY, \
52-
OPT_##GROUP, OPT_##ALIAS, ALIASARGS, \
48+
VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, METAVAR, \
49+
VALUES) \
50+
{PREFIX, \
51+
NAME, \
52+
HELPTEXT, \
53+
HELPTEXTSFORVARIANTS, \
54+
METAVAR, \
55+
OPT_##ID, \
56+
opt::Option::KIND##Class, \
57+
PARAM, \
58+
FLAGS, \
59+
VISIBILITY, \
60+
OPT_##GROUP, \
61+
OPT_##ALIAS, \
62+
ALIASARGS, \
5363
VALUES},
5464
#include "Options.inc"
5565
#undef OPTION

lld/MinGW/Driver.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,21 @@ enum {
6969
// Create table mapping all options defined in Options.td
7070
static constexpr opt::OptTable::Info infoTable[] = {
7171
#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \
72-
VISIBILITY, PARAM, HELPTEXT, METAVAR, VALUES) \
73-
{PREFIX, NAME, HELPTEXT, \
74-
METAVAR, OPT_##ID, opt::Option::KIND##Class, \
75-
PARAM, FLAGS, VISIBILITY, \
76-
OPT_##GROUP, OPT_##ALIAS, ALIASARGS, \
72+
VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, METAVAR, \
73+
VALUES) \
74+
{PREFIX, \
75+
NAME, \
76+
HELPTEXT, \
77+
HELPTEXTSFORVARIANTS, \
78+
METAVAR, \
79+
OPT_##ID, \
80+
opt::Option::KIND##Class, \
81+
PARAM, \
82+
FLAGS, \
83+
VISIBILITY, \
84+
OPT_##GROUP, \
85+
OPT_##ALIAS, \
86+
ALIASARGS, \
7787
VALUES},
7888
#include "Options.inc"
7989
#undef OPTION

lld/wasm/Driver.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,21 @@ bool link(ArrayRef<const char *> args, llvm::raw_ostream &stdoutOS,
132132
// Create table mapping all options defined in Options.td
133133
static constexpr opt::OptTable::Info optInfo[] = {
134134
#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \
135-
VISIBILITY, PARAM, HELPTEXT, METAVAR, VALUES) \
136-
{PREFIX, NAME, HELPTEXT, \
137-
METAVAR, OPT_##ID, opt::Option::KIND##Class, \
138-
PARAM, FLAGS, VISIBILITY, \
139-
OPT_##GROUP, OPT_##ALIAS, ALIASARGS, \
135+
VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, METAVAR, \
136+
VALUES) \
137+
{PREFIX, \
138+
NAME, \
139+
HELPTEXT, \
140+
HELPTEXTSFORVARIANTS, \
141+
METAVAR, \
142+
OPT_##ID, \
143+
opt::Option::KIND##Class, \
144+
PARAM, \
145+
FLAGS, \
146+
VISIBILITY, \
147+
OPT_##GROUP, \
148+
OPT_##ALIAS, \
149+
ALIASARGS, \
140150
VALUES},
141151
#include "Options.inc"
142152
#undef OPTION

llvm/include/llvm/Option/OptParser.td

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@ class OptionGroup<string name> {
9393

9494
// Define the option class.
9595

96+
class HelpTextVariant<list<OptionVisibility> visibilities, string text> {
97+
list<OptionVisibility> Visibilities = visibilities;
98+
string Text = text;
99+
}
100+
96101
class Option<list<string> prefixes, string name, OptionKind kind> {
97102
string EnumName = ?; // Uses the def name if undefined.
98103
list<string> Prefixes = prefixes;
@@ -101,6 +106,7 @@ class Option<list<string> prefixes, string name, OptionKind kind> {
101106
// Used by MultiArg option kind.
102107
int NumArgs = 0;
103108
string HelpText = ?;
109+
list<HelpTextVariant> HelpTextsForVariants = [];
104110
string MetaVarName = ?;
105111
string Values = ?;
106112
code ValuesCode = ?;
@@ -155,6 +161,12 @@ class Visibility<list<OptionVisibility> visibility> {
155161
}
156162
class Group<OptionGroup group> { OptionGroup Group = group; }
157163
class HelpText<string text> { string HelpText = text; }
164+
class HelpTextForVariants<list<OptionVisibility> Visibilities, string text> {
165+
list<HelpTextVariant> HelpTextsForVariants = [
166+
HelpTextVariant<Visibilities, text>
167+
];
168+
}
169+
158170
class MetaVarName<string name> { string MetaVarName = name; }
159171
class Values<string value> { string Values = value; }
160172
class ValuesCode<code valuecode> { code ValuesCode = valuecode; }

0 commit comments

Comments
 (0)