From 8e41a688a5b1000b51c61b9d103545791c54af17 Mon Sep 17 00:00:00 2001 From: Jan Svoboda Date: Fri, 20 Nov 2020 12:49:51 +0100 Subject: [PATCH] [clang][cli] Port DependencyOutput option flags to new option parsing system Depends on D91861. Reviewed By: dexonsmith Original patch by Daniel Grumberg. Differential Revision: https://reviews.llvm.org/D83694 --- clang/include/clang/Driver/Options.td | 13 +++++--- clang/lib/Frontend/CompilerInvocation.cpp | 53 ++++++++++++++++++++----------- llvm/include/llvm/Option/OptParser.td | 2 +- 3 files changed, 45 insertions(+), 23 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index a8ab5cc..24662f1 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -429,7 +429,8 @@ def G : JoinedOrSeparate<["-"], "G">, Flags<[NoXarchOption]>, Group, "into small data section (MIPS / Hexagon)">; def G_EQ : Joined<["-"], "G=">, Flags<[NoXarchOption]>, Group, Alias; def H : Flag<["-"], "H">, Flags<[CC1Option]>, Group, - HelpText<"Show header includes and nesting depth">; + HelpText<"Show header includes and nesting depth">, + MarshallingInfoFlag<"DependencyOutputOpts.ShowHeaderIncludes">; def I_ : Flag<["-"], "I-">, Group, HelpText<"Restrict all prior -I flags to double-quoted inclusion and " "remove current directory from include path">; @@ -455,17 +456,21 @@ def MF : JoinedOrSeparate<["-"], "MF">, Group, HelpText<"Write depfile output from -MMD, -MD, -MM, or -M to ">, MetaVarName<"">; def MG : Flag<["-"], "MG">, Group, Flags<[CC1Option]>, - HelpText<"Add missing headers to depfile">; + HelpText<"Add missing headers to depfile">, + MarshallingInfoFlag<"DependencyOutputOpts.AddMissingHeaderDeps">; def MJ : JoinedOrSeparate<["-"], "MJ">, Group, HelpText<"Write a compilation database entry per input">; def MP : Flag<["-"], "MP">, Group, Flags<[CC1Option]>, - HelpText<"Create phony target for each dependency (other than main file)">; + HelpText<"Create phony target for each dependency (other than main file)">, + MarshallingInfoFlag<"DependencyOutputOpts.UsePhonyTargets">; def MQ : JoinedOrSeparate<["-"], "MQ">, Group, Flags<[CC1Option]>, HelpText<"Specify name of main file output to quote in depfile">; def MT : JoinedOrSeparate<["-"], "MT">, Group, Flags<[CC1Option]>, HelpText<"Specify name of main file output in depfile">; def MV : Flag<["-"], "MV">, Group, Flags<[CC1Option]>, - HelpText<"Use NMake/Jom format for the depfile">; + HelpText<"Use NMake/Jom format for the depfile">, + MarshallingInfoFlag<"DependencyOutputOpts.OutputFormat", "DependencyOutputFormat::Make">, + Normalizer<"makeFlagToValueNormalizer(DependencyOutputFormat::NMake)">; def Mach : Flag<["-"], "Mach">, Group; def O0 : Flag<["-"], "O0">, Group, Flags<[CC1Option, HelpHidden]>; def O4 : Flag<["-"], "O4">, Group, Flags<[CC1Option, HelpHidden]>; diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index f23d1e3..761f9eb 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -144,20 +144,44 @@ static Optional normalizeSimpleNegativeFlag(OptSpecifier Opt, unsigned, return None; } -void denormalizeSimpleFlag(SmallVectorImpl &Args, - const char *Spelling, - CompilerInvocation::StringAllocator SA, - unsigned TableIndex, unsigned Value) { +/// The tblgen-erated code passes in a fifth parameter of an arbitrary type, but +/// denormalizeSimpleFlags never looks at it. Avoid bloating compile-time with +/// unnecessary template instantiations and just ignore it with a variadic +/// argument. +static void denormalizeSimpleFlag(SmallVectorImpl &Args, + const char *Spelling, + CompilerInvocation::StringAllocator, unsigned, + /*T*/...) { Args.push_back(Spelling); } -template -static llvm::Optional -normalizeFlagToValue(OptSpecifier Opt, unsigned TableIndex, const ArgList &Args, - DiagnosticsEngine &Diags) { - if (Args.hasArg(Opt)) - return Value; - return None; +namespace { +template struct FlagToValueNormalizer { + T Value; + + Optional operator()(OptSpecifier Opt, unsigned, const ArgList &Args, + DiagnosticsEngine &) { + if (Args.hasArg(Opt)) + return Value; + return None; + } +}; +} // namespace + +template static constexpr bool is_int_convertible() { + return sizeof(T) <= sizeof(uint64_t) && + std::is_trivially_constructible::value && + std::is_trivially_constructible::value; +} + +template (), bool> = false> +static FlagToValueNormalizer makeFlagToValueNormalizer(T Value) { + return FlagToValueNormalizer{Value}; +} + +template (), bool> = false> +static FlagToValueNormalizer makeFlagToValueNormalizer(T Value) { + return FlagToValueNormalizer{std::move(Value)}; } static Optional normalizeBooleanFlag(OptSpecifier PosOpt, @@ -1590,13 +1614,8 @@ static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts, ArgList &Args) { Opts.OutputFile = std::string(Args.getLastArgValue(OPT_dependency_file)); Opts.Targets = Args.getAllArgValues(OPT_MT); - Opts.IncludeSystemHeaders = Args.hasArg(OPT_sys_header_deps); - Opts.IncludeModuleFiles = Args.hasArg(OPT_module_file_deps); - Opts.UsePhonyTargets = Args.hasArg(OPT_MP); - Opts.ShowHeaderIncludes = Args.hasArg(OPT_H); Opts.HeaderIncludeOutputFile = std::string(Args.getLastArgValue(OPT_header_include_file)); - Opts.AddMissingHeaderDeps = Args.hasArg(OPT_MG); if (Args.hasArg(OPT_show_includes)) { // Writing both /showIncludes and preprocessor output to stdout // would produce interleaved output, so use stderr for /showIncludes. @@ -1611,8 +1630,6 @@ static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts, Opts.DOTOutputFile = std::string(Args.getLastArgValue(OPT_dependency_dot)); Opts.ModuleDependencyOutputDir = std::string(Args.getLastArgValue(OPT_module_dependency_dir)); - if (Args.hasArg(OPT_MV)) - Opts.OutputFormat = DependencyOutputFormat::NMake; // Add sanitizer blacklists as extra dependencies. // They won't be discovered by the regular preprocessor, so // we let make / ninja to know about this implicit dependency. diff --git a/llvm/include/llvm/Option/OptParser.td b/llvm/include/llvm/Option/OptParser.td index 67bc73d..717b5fa 100644 --- a/llvm/include/llvm/Option/OptParser.td +++ b/llvm/include/llvm/Option/OptParser.td @@ -170,7 +170,7 @@ class MarshallingInfoFlag class MarshallingInfoBitfieldFlag : MarshallingInfoFlag { - code Normalizer = "(normalizeFlagToValue)"; + code Normalizer = "makeFlagToValueNormalizer("#value#")"; code ValueMerger = "mergeMaskValue"; code ValueExtractor = "(extractMaskValue)"; } -- 2.7.4