Skip to content

Commit b2eda85

Browse files
committed
[OptTable] Make explicitly included options override excluded ones
When we have both explicitly included and excluded option sets, we were excluding anything from the latter set regardless of what was in the former. This doesn't compose well and led to an overly complicated design around DXC options where a third flag was introduced to handle options that overlapped between DXC and CL. With this change we check the included options before excluding anything from the exclude list, which allows for options that are in multiple categories to be handled in a sensible way. This allows us to remove CLDXCOption but should otherwise be NFC. Differential Revision: https://reviews.llvm.org/D155729
1 parent aa972f6 commit b2eda85

File tree

6 files changed

+44
-53
lines changed

6 files changed

+44
-53
lines changed

clang-tools-extra/clangd/CompileCommands.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -238,13 +238,10 @@ void CommandMangler::operator()(tooling::CompileCommand &Command,
238238
ArgList = OptTable.ParseArgs(
239239
llvm::ArrayRef(OriginalArgs).drop_front(), IgnoredCount, IgnoredCount,
240240
/*FlagsToInclude=*/
241-
IsCLMode ? (driver::options::CLOption | driver::options::CoreOption |
242-
driver::options::CLDXCOption)
241+
IsCLMode ? (driver::options::CLOption | driver::options::CoreOption)
243242
: /*everything*/ 0,
244243
/*FlagsToExclude=*/driver::options::NoDriverOption |
245-
(IsCLMode
246-
? 0
247-
: (driver::options::CLOption | driver::options::CLDXCOption)));
244+
(IsCLMode ? 0 : driver::options::CLOption));
248245

249246
llvm::SmallVector<unsigned, 1> IndicesToDrop;
250247
// Having multiple architecture options (e.g. when building fat binaries)
@@ -449,8 +446,6 @@ unsigned char getModes(const llvm::opt::Option &Opt) {
449446
if (!Opt.hasFlag(driver::options::NoDriverOption)) {
450447
if (Opt.hasFlag(driver::options::CLOption)) {
451448
Result |= DM_CL;
452-
} else if (Opt.hasFlag(driver::options::CLDXCOption)) {
453-
Result |= DM_CL;
454449
} else {
455450
Result |= DM_GCC;
456451
if (Opt.hasFlag(driver::options::CoreOption)) {

clang/include/clang/Driver/Options.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,8 @@ enum ClangFlags {
3636
FC1Option = (1 << 15),
3737
FlangOnlyOption = (1 << 16),
3838
DXCOption = (1 << 17),
39-
CLDXCOption = (1 << 18),
40-
Ignored = (1 << 19),
41-
TargetSpecific = (1 << 20),
39+
Ignored = (1 << 18),
40+
TargetSpecific = (1 << 19),
4241
};
4342

4443
enum ID {

clang/include/clang/Driver/Options.td

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,6 @@ def CC1AsOption : OptionFlag;
5353
// are made available when the driver is running in DXC compatibility mode.
5454
def DXCOption : OptionFlag;
5555

56-
// CLDXCOption - This is a cl.exe/dxc.exe compatibility option. Options with this flag
57-
// are made available when the driver is running in CL/DXC compatibility mode.
58-
def CLDXCOption : OptionFlag;
59-
6056
// NoDriverOption - This option should not be accepted by the driver.
6157
def NoDriverOption : OptionFlag;
6258

@@ -6856,7 +6852,7 @@ def defsym : Separate<["-"], "defsym">,
68566852
// clang-cl Options
68576853
//===----------------------------------------------------------------------===//
68586854

6859-
def cl_Group : OptionGroup<"<clang-cl options>">, Flags<[CLDXCOption]>,
6855+
def cl_Group : OptionGroup<"<clang-cl options>">,
68606856
HelpText<"CL.EXE COMPATIBILITY OPTIONS">;
68616857

68626858
def cl_compile_Group : OptionGroup<"<clang-cl compile-only options>">,
@@ -6865,42 +6861,45 @@ def cl_compile_Group : OptionGroup<"<clang-cl compile-only options>">,
68656861
def cl_ignored_Group : OptionGroup<"<clang-cl ignored options>">,
68666862
Group<cl_Group>;
68676863

6868-
class CLFlag<string name> : Option<["/", "-"], name, KIND_FLAG>,
6869-
Group<cl_Group>, Flags<[CLOption, NoXarchOption]>;
6870-
6871-
class CLDXCFlag<string name> : Option<["/", "-"], name, KIND_FLAG>,
6872-
Group<cl_Group>, Flags<[CLDXCOption, NoXarchOption]>;
6873-
6874-
class CLCompileFlag<string name> : Option<["/", "-"], name, KIND_FLAG>,
6875-
Group<cl_compile_Group>, Flags<[CLOption, NoXarchOption]>;
6864+
class CLFlagOpts<list<OptionFlag> flags>
6865+
: Flags<!listconcat(flags, [NoXarchOption])>;
68766866

6877-
class CLIgnoredFlag<string name> : Option<["/", "-"], name, KIND_FLAG>,
6878-
Group<cl_ignored_Group>, Flags<[CLOption, NoXarchOption]>;
6867+
class CLFlag<string name, list<OptionFlag> flags = [CLOption]>
6868+
: Option<["/", "-"], name, KIND_FLAG>,
6869+
Group<cl_Group>, CLFlagOpts<flags>;
68796870

6880-
class CLJoined<string name> : Option<["/", "-"], name, KIND_JOINED>,
6881-
Group<cl_Group>, Flags<[CLOption, NoXarchOption]>;
6871+
class CLCompileFlag<string name, list<OptionFlag> flags = [CLOption]>
6872+
: Option<["/", "-"], name, KIND_FLAG>,
6873+
Group<cl_compile_Group>, CLFlagOpts<flags>;
68826874

6883-
class CLDXCJoined<string name> : Option<["/", "-"], name, KIND_JOINED>,
6884-
Group<cl_Group>, Flags<[CLDXCOption, NoXarchOption]>;
6875+
class CLIgnoredFlag<string name, list<OptionFlag> flags = [CLOption]>
6876+
: Option<["/", "-"], name, KIND_FLAG>,
6877+
Group<cl_ignored_Group>, CLFlagOpts<flags>;
68856878

6886-
class CLCompileJoined<string name> : Option<["/", "-"], name, KIND_JOINED>,
6887-
Group<cl_compile_Group>, Flags<[CLOption, NoXarchOption]>;
6879+
class CLJoined<string name, list<OptionFlag> flags = [CLOption]>
6880+
: Option<["/", "-"], name, KIND_JOINED>,
6881+
Group<cl_Group>, CLFlagOpts<flags>;
68886882

6889-
class CLIgnoredJoined<string name> : Option<["/", "-"], name, KIND_JOINED>,
6890-
Group<cl_ignored_Group>, Flags<[CLOption, NoXarchOption, HelpHidden]>;
6883+
class CLCompileJoined<string name, list<OptionFlag> flags = [CLOption]>
6884+
: Option<["/", "-"], name, KIND_JOINED>,
6885+
Group<cl_compile_Group>, CLFlagOpts<flags>;
68916886

6892-
class CLJoinedOrSeparate<string name> : Option<["/", "-"], name,
6893-
KIND_JOINED_OR_SEPARATE>, Group<cl_Group>, Flags<[CLOption, NoXarchOption]>;
6887+
class CLIgnoredJoined<string name, list<OptionFlag> flags = [CLOption]>
6888+
: Option<["/", "-"], name, KIND_JOINED>,
6889+
Group<cl_ignored_Group>, CLFlagOpts<!listconcat(flags, [HelpHidden])>;
68946890

6895-
class CLDXCJoinedOrSeparate<string name> : Option<["/", "-"], name,
6896-
KIND_JOINED_OR_SEPARATE>, Group<cl_Group>, Flags<[CLDXCOption, NoXarchOption]>;
6891+
class CLJoinedOrSeparate<string name, list<OptionFlag> flags = [CLOption]>
6892+
: Option<["/", "-"], name, KIND_JOINED_OR_SEPARATE>,
6893+
Group<cl_Group>, CLFlagOpts<flags>;
68976894

6898-
class CLCompileJoinedOrSeparate<string name> : Option<["/", "-"], name,
6899-
KIND_JOINED_OR_SEPARATE>, Group<cl_compile_Group>,
6900-
Flags<[CLOption, NoXarchOption]>;
6895+
class CLCompileJoinedOrSeparate<string name,
6896+
list<OptionFlag> flags = [CLOption]>
6897+
: Option<["/", "-"], name, KIND_JOINED_OR_SEPARATE>,
6898+
Group<cl_compile_Group>, CLFlagOpts<flags>;
69016899

6902-
class CLRemainingArgsJoined<string name> : Option<["/", "-"], name,
6903-
KIND_REMAINING_ARGS_JOINED>, Group<cl_Group>, Flags<[CLOption, NoXarchOption]>;
6900+
class CLRemainingArgsJoined<string name, list<OptionFlag> flags = [CLOption]>
6901+
: Option<["/", "-"], name, KIND_REMAINING_ARGS_JOINED>,
6902+
Group<cl_Group>, CLFlagOpts<flags>;
69046903

69056904
// Aliases:
69066905
// (We don't put any of these in cl_compile_Group as the options they alias are
@@ -6971,15 +6970,15 @@ def _SLASH_help : CLFlag<"help">, Alias<help>,
69716970
def _SLASH_HELP : CLFlag<"HELP">, Alias<help>;
69726971
def _SLASH_hotpatch : CLFlag<"hotpatch">, Alias<fms_hotpatch>,
69736972
HelpText<"Create hotpatchable image">;
6974-
def _SLASH_I : CLDXCJoinedOrSeparate<"I">,
6973+
def _SLASH_I : CLJoinedOrSeparate<"I", [CLOption, DXCOption]>,
69756974
HelpText<"Add directory to include search path">, MetaVarName<"<dir>">,
69766975
Alias<I>;
69776976
def _SLASH_J : CLFlag<"J">, HelpText<"Make char type unsigned">,
69786977
Alias<funsigned_char>;
69796978

69806979
// The _SLASH_O option handles all the /O flags, but we also provide separate
69816980
// aliased options to provide separate help messages.
6982-
def _SLASH_O : CLDXCJoined<"O">,
6981+
def _SLASH_O : CLJoined<"O", [CLOption, DXCOption]>,
69836982
HelpText<"Set multiple /O flags at once; e.g. '/O2y-' for '/O2 /Oy-'">,
69846983
MetaVarName<"<flags>">;
69856984
def : CLFlag<"O1">, Alias<_SLASH_O>, AliasArgs<["1"]>,
@@ -6992,7 +6991,7 @@ def : CLFlag<"Ob1">, Alias<_SLASH_O>, AliasArgs<["b1"]>,
69926991
HelpText<"Only inline functions explicitly or implicitly marked inline">;
69936992
def : CLFlag<"Ob2">, Alias<_SLASH_O>, AliasArgs<["b2"]>,
69946993
HelpText<"Inline functions as deemed beneficial by the compiler">;
6995-
def : CLDXCFlag<"Od">, Alias<_SLASH_O>, AliasArgs<["d"]>,
6994+
def : CLFlag<"Od", [CLOption, DXCOption]>, Alias<_SLASH_O>, AliasArgs<["d"]>,
69966995
HelpText<"Disable optimization">;
69976996
def : CLFlag<"Og">, Alias<_SLASH_O>, AliasArgs<["g"]>,
69986997
HelpText<"No effect">;

clang/lib/Driver/Driver.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6496,21 +6496,17 @@ Driver::getIncludeExcludeOptionFlagMasks(bool IsClCompatMode) const {
64966496
if (IsClCompatMode) {
64976497
// Include CL and Core options.
64986498
IncludedFlagsBitmask |= options::CLOption;
6499-
IncludedFlagsBitmask |= options::CLDXCOption;
65006499
IncludedFlagsBitmask |= options::CoreOption;
65016500
} else {
65026501
ExcludedFlagsBitmask |= options::CLOption;
65036502
}
65046503
if (IsDXCMode()) {
65056504
// Include DXC and Core options.
65066505
IncludedFlagsBitmask |= options::DXCOption;
6507-
IncludedFlagsBitmask |= options::CLDXCOption;
65086506
IncludedFlagsBitmask |= options::CoreOption;
65096507
} else {
65106508
ExcludedFlagsBitmask |= options::DXCOption;
65116509
}
6512-
if (!IsClCompatMode && !IsDXCMode())
6513-
ExcludedFlagsBitmask |= options::CLDXCOption;
65146510

65156511
return std::make_pair(IncludedFlagsBitmask, ExcludedFlagsBitmask);
65166512
}

clang/lib/Tooling/InterpolatingCompilationDatabase.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,8 @@ struct TransferableCommand {
164164
const unsigned OldPos = Pos;
165165
std::unique_ptr<llvm::opt::Arg> Arg(OptTable.ParseOneArg(
166166
ArgList, Pos,
167-
/* Include */ ClangCLMode ? CoreOption | CLOption | CLDXCOption : 0,
168-
/* Exclude */ ClangCLMode ? 0 : CLOption | CLDXCOption));
167+
/* Include */ ClangCLMode ? CoreOption | CLOption : 0,
168+
/* Exclude */ ClangCLMode ? 0 : CLOption));
169169

170170
if (!Arg)
171171
continue;

llvm/lib/Option/OptTable.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,8 @@ std::unique_ptr<Arg> OptTable::ParseOneArg(const ArgList &Args, unsigned &Index,
421421
if (FlagsToInclude && !Opt.hasFlag(FlagsToInclude))
422422
continue;
423423
if (Opt.hasFlag(FlagsToExclude))
424-
continue;
424+
if (!FlagsToInclude || !Opt.hasFlag(FlagsToInclude))
425+
continue;
425426

426427
// See if this option matches.
427428
if (std::unique_ptr<Arg> A =
@@ -650,7 +651,8 @@ void OptTable::printHelp(raw_ostream &OS, const char *Usage, const char *Title,
650651
if (FlagsToInclude && !(Flags & FlagsToInclude))
651652
continue;
652653
if (Flags & FlagsToExclude)
653-
continue;
654+
if (!FlagsToInclude || !(Flags & FlagsToInclude))
655+
continue;
654656

655657
// If an alias doesn't have a help text, show a help text for the aliased
656658
// option instead.

0 commit comments

Comments
 (0)