diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -434,6 +434,7 @@ HelpText<"Pass the comma separated arguments in to the assembler">, MetaVarName<"">; def Wall : Flag<["-"], "Wall">, Group, Flags<[CC1Option, HelpHidden]>; +def feverything : Flag<["-"], "feverything">, Group, Flags<[CC1Option, HelpHidden]>; def WCL4 : Flag<["-"], "WCL4">, Group, Flags<[CC1Option, HelpHidden]>; def Wdeprecated : Flag<["-"], "Wdeprecated">, Group, Flags<[CC1Option]>, HelpText<"Enable warnings for deprecated constructs and define __DEPRECATED">; diff --git a/clang/include/clang/Frontend/CompilerInvocation.h b/clang/include/clang/Frontend/CompilerInvocation.h --- a/clang/include/clang/Frontend/CompilerInvocation.h +++ b/clang/include/clang/Frontend/CompilerInvocation.h @@ -31,6 +31,8 @@ namespace opt { class ArgList; +class InputArgList; +class OptTable; } // namespace opt @@ -61,6 +63,8 @@ bool DefaultDiagColor = true, bool DefaultShowOpt = true); +void ParseFEverything(llvm::opt::OptTable *Opts, llvm::opt::InputArgList *Args); + class CompilerInvocationBase { public: /// Options controlling the language variant. diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -5389,6 +5389,9 @@ } } + if (Args.hasArg(options::OPT_feverything)) + CmdArgs.push_back("-feverything"); + if (Args.hasFlag(options::OPT_faddrsig, options::OPT_fno_addrsig, (TC.getTriple().isOSBinFormatELF() || TC.getTriple().isOSBinFormatCOFF()) && diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -1427,6 +1427,25 @@ return Success; } +void clang::ParseFEverything(llvm::opt::OptTable *Opts, + llvm::opt::InputArgList *Args) { + if (!Args->hasArg(options::OPT_feverything)) + return; + const unsigned f_group = Opts->getOption(OPT_f_Group).getID(); + unsigned i = Opts->getFirstSearchableIndex(); + const unsigned len = Opts->getNumOptions(); + for (; i != len; ++i) { + const Option &opt = Opts->getOption(i); + const Option group = opt.getGroup(); + // TODO: add more groups + if (group.isValid() && group.getID() == f_group) { + const std::string Flag = opt.getPrefixedName(); + if (Flag.back() != '=' && Flag.back() != '-') + Args->append(new Arg(opt, Flag, Args->MakeIndex(Flag), Flag.c_str())); + } + } +} + bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args, DiagnosticsEngine *Diags, bool DefaultDiagColor, bool DefaultShowOpt) { @@ -3247,6 +3266,7 @@ InputArgList Args = Opts->ParseArgs(llvm::makeArrayRef(ArgBegin, ArgEnd), MissingArgIndex, MissingArgCount, IncludedFlagsBitmask); + ParseFEverything(Opts.get(), &Args); LangOptions &LangOpts = *Res.getLangOpts(); // Check for missing argument error. diff --git a/llvm/include/llvm/Option/OptTable.h b/llvm/include/llvm/Option/OptTable.h --- a/llvm/include/llvm/Option/OptTable.h +++ b/llvm/include/llvm/Option/OptTable.h @@ -88,6 +88,8 @@ /// Return the total number of option classes. unsigned getNumOptions() const { return OptionInfos.size(); } + unsigned getFirstSearchableIndex() const { return FirstSearchableIndex; } + /// Get the given Opt's Option instance, lazily creating it /// if necessary. ///