Skip to content

Commit 990645f

Browse files
committed
Revert "[OptTable] Make explicitly included options override excluded ones"
Looks like a couple of flang bots are broken by this change. Reverting to investigate. This reverts commit b2eda85.
1 parent 52eab34 commit 990645f

File tree

6 files changed

+53
-44
lines changed

6 files changed

+53
-44
lines changed

clang-tools-extra/clangd/CompileCommands.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,10 +238,13 @@ 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)
241+
IsCLMode ? (driver::options::CLOption | driver::options::CoreOption |
242+
driver::options::CLDXCOption)
242243
: /*everything*/ 0,
243244
/*FlagsToExclude=*/driver::options::NoDriverOption |
244-
(IsCLMode ? 0 : driver::options::CLOption));
245+
(IsCLMode
246+
? 0
247+
: (driver::options::CLOption | driver::options::CLDXCOption)));
245248

246249
llvm::SmallVector<unsigned, 1> IndicesToDrop;
247250
// Having multiple architecture options (e.g. when building fat binaries)
@@ -446,6 +449,8 @@ unsigned char getModes(const llvm::opt::Option &Opt) {
446449
if (!Opt.hasFlag(driver::options::NoDriverOption)) {
447450
if (Opt.hasFlag(driver::options::CLOption)) {
448451
Result |= DM_CL;
452+
} else if (Opt.hasFlag(driver::options::CLDXCOption)) {
453+
Result |= DM_CL;
449454
} else {
450455
Result |= DM_GCC;
451456
if (Opt.hasFlag(driver::options::CoreOption)) {

clang/include/clang/Driver/Options.h

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

4344
enum ID {

clang/include/clang/Driver/Options.td

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ 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+
5660
// NoDriverOption - This option should not be accepted by the driver.
5761
def NoDriverOption : OptionFlag;
5862

@@ -6852,7 +6856,7 @@ def defsym : Separate<["-"], "defsym">,
68526856
// clang-cl Options
68536857
//===----------------------------------------------------------------------===//
68546858

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

68586862
def cl_compile_Group : OptionGroup<"<clang-cl compile-only options>">,
@@ -6861,45 +6865,42 @@ def cl_compile_Group : OptionGroup<"<clang-cl compile-only options>">,
68616865
def cl_ignored_Group : OptionGroup<"<clang-cl ignored options>">,
68626866
Group<cl_Group>;
68636867

6864-
class CLFlagOpts<list<OptionFlag> flags>
6865-
: Flags<!listconcat(flags, [NoXarchOption])>;
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]>;
68666876

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

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

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

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

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

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

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

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

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

69046905
// Aliases:
69056906
// (We don't put any of these in cl_compile_Group as the options they alias are
@@ -6970,15 +6971,15 @@ def _SLASH_help : CLFlag<"help">, Alias<help>,
69706971
def _SLASH_HELP : CLFlag<"HELP">, Alias<help>;
69716972
def _SLASH_hotpatch : CLFlag<"hotpatch">, Alias<fms_hotpatch>,
69726973
HelpText<"Create hotpatchable image">;
6973-
def _SLASH_I : CLJoinedOrSeparate<"I", [CLOption, DXCOption]>,
6974+
def _SLASH_I : CLDXCJoinedOrSeparate<"I">,
69746975
HelpText<"Add directory to include search path">, MetaVarName<"<dir>">,
69756976
Alias<I>;
69766977
def _SLASH_J : CLFlag<"J">, HelpText<"Make char type unsigned">,
69776978
Alias<funsigned_char>;
69786979

69796980
// The _SLASH_O option handles all the /O flags, but we also provide separate
69806981
// aliased options to provide separate help messages.
6981-
def _SLASH_O : CLJoined<"O", [CLOption, DXCOption]>,
6982+
def _SLASH_O : CLDXCJoined<"O">,
69826983
HelpText<"Set multiple /O flags at once; e.g. '/O2y-' for '/O2 /Oy-'">,
69836984
MetaVarName<"<flags>">;
69846985
def : CLFlag<"O1">, Alias<_SLASH_O>, AliasArgs<["1"]>,
@@ -6991,7 +6992,7 @@ def : CLFlag<"Ob1">, Alias<_SLASH_O>, AliasArgs<["b1"]>,
69916992
HelpText<"Only inline functions explicitly or implicitly marked inline">;
69926993
def : CLFlag<"Ob2">, Alias<_SLASH_O>, AliasArgs<["b2"]>,
69936994
HelpText<"Inline functions as deemed beneficial by the compiler">;
6994-
def : CLFlag<"Od", [CLOption, DXCOption]>, Alias<_SLASH_O>, AliasArgs<["d"]>,
6995+
def : CLDXCFlag<"Od">, Alias<_SLASH_O>, AliasArgs<["d"]>,
69956996
HelpText<"Disable optimization">;
69966997
def : CLFlag<"Og">, Alias<_SLASH_O>, AliasArgs<["g"]>,
69976998
HelpText<"No effect">;

clang/lib/Driver/Driver.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6496,17 +6496,21 @@ Driver::getIncludeExcludeOptionFlagMasks(bool IsClCompatMode) const {
64966496
if (IsClCompatMode) {
64976497
// Include CL and Core options.
64986498
IncludedFlagsBitmask |= options::CLOption;
6499+
IncludedFlagsBitmask |= options::CLDXCOption;
64996500
IncludedFlagsBitmask |= options::CoreOption;
65006501
} else {
65016502
ExcludedFlagsBitmask |= options::CLOption;
65026503
}
65036504
if (IsDXCMode()) {
65046505
// Include DXC and Core options.
65056506
IncludedFlagsBitmask |= options::DXCOption;
6507+
IncludedFlagsBitmask |= options::CLDXCOption;
65066508
IncludedFlagsBitmask |= options::CoreOption;
65076509
} else {
65086510
ExcludedFlagsBitmask |= options::DXCOption;
65096511
}
6512+
if (!IsClCompatMode && !IsDXCMode())
6513+
ExcludedFlagsBitmask |= options::CLDXCOption;
65106514

65116515
return std::make_pair(IncludedFlagsBitmask, ExcludedFlagsBitmask);
65126516
}

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 : 0,
168-
/* Exclude */ ClangCLMode ? 0 : CLOption));
167+
/* Include */ ClangCLMode ? CoreOption | CLOption | CLDXCOption : 0,
168+
/* Exclude */ ClangCLMode ? 0 : CLOption | CLDXCOption));
169169

170170
if (!Arg)
171171
continue;

llvm/lib/Option/OptTable.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -421,8 +421,7 @@ 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-
if (!FlagsToInclude || !Opt.hasFlag(FlagsToInclude))
425-
continue;
424+
continue;
426425

427426
// See if this option matches.
428427
if (std::unique_ptr<Arg> A =
@@ -651,8 +650,7 @@ void OptTable::printHelp(raw_ostream &OS, const char *Usage, const char *Title,
651650
if (FlagsToInclude && !(Flags & FlagsToInclude))
652651
continue;
653652
if (Flags & FlagsToExclude)
654-
if (!FlagsToInclude || !(Flags & FlagsToInclude))
655-
continue;
653+
continue;
656654

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

0 commit comments

Comments
 (0)