jansvoboda11 created this revision. jansvoboda11 added reviewers: Bigcheese, dexonsmith. Herald added a subscriber: dang. jansvoboda11 requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
This patch implements generation of remaining preprocessor output options and tests it by performing parse-generate-parse round trip. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D96156 Files: clang/include/clang/Driver/Options.td clang/include/clang/Frontend/CompilerInvocation.h clang/lib/Frontend/CompilerInvocation.cpp
Index: clang/lib/Frontend/CompilerInvocation.cpp =================================================================== --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -4092,15 +4092,76 @@ "PreprocessorOptions"); } -static void ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts, - ArgList &Args, - frontend::ActionKind Action) { - if (isStrictlyPreprocessorAction(Action)) - Opts.ShowCPP = !Args.hasArg(OPT_dM); - else - Opts.ShowCPP = 0; +void CompilerInvocation::GeneratePreprocessorOutputArgs( + const PreprocessorOutputOptions &Opts, SmallVectorImpl<const char *> &Args, + StringAllocator SA, frontend::ActionKind Action) { + const PreprocessorOutputOptions &PreprocessorOutputOpts = Opts; + +#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + GENERATE_OPTION_WITH_MARSHALLING( \ + Args, SA, KIND, FLAGS, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \ + IMPLIED_CHECK, IMPLIED_VALUE, DENORMALIZER, EXTRACTOR, TABLE_INDEX) +#include "clang/Driver/Options.inc" +#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING + + bool Generate_dM = isStrictlyPreprocessorAction(Action) && !Opts.ShowCPP; + if (Generate_dM) + GenerateArg(Args, OPT_dM, SA); + if (!Generate_dM && Opts.ShowMacros) + GenerateArg(Args, OPT_dD, SA); +} + +static bool ParsePreprocessorOutputArgsImpl(PreprocessorOutputOptions &Opts, + ArgList &Args, + DiagnosticsEngine &Diags, + frontend::ActionKind Action) { + PreprocessorOutputOptions &PreprocessorOutputOpts = Opts; + unsigned NumErrorsBefore = Diags.getNumErrors(); + bool Success = true; + +#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \ + SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ + IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ + MERGER, TABLE_INDEX) +#include "clang/Driver/Options.inc" +#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING + Opts.ShowCPP = isStrictlyPreprocessorAction(Action) && !Args.hasArg(OPT_dM); Opts.ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD); + + return Success && Diags.getNumErrors() == NumErrorsBefore; +} + +bool CompilerInvocation::ParsePreprocessorOutputArgs(CompilerInvocation &Res, + PreprocessorOutputOptions &Opts, + ArgList &Args, DiagnosticsEngine &Diags, + frontend::ActionKind Action) { + PreprocessorOutputOptions DummyOpts; + + return RoundTrip( + [Action](CompilerInvocation &Res, ArgList &Args, + DiagnosticsEngine &Diags) { + return ParsePreprocessorOutputArgsImpl(Res.getPreprocessorOutputOpts(), + Args, Diags, Action); + }, + [Action](CompilerInvocation &Res, SmallVectorImpl<const char *> &Args, + CompilerInvocation::StringAllocator SA) { + GeneratePreprocessorOutputArgs(Res.getPreprocessorOutputOpts(), Args, + SA, Action); + }, + [&DummyOpts](CompilerInvocation &Res) { + std::swap(DummyOpts, Res.getPreprocessorOutputOpts()); + }, + Res, Args, Diags, "PreprocessorOutputOptions"); } static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args, @@ -4221,7 +4282,7 @@ ParsePreprocessorArgs(Res, Res.getPreprocessorOpts(), Args, Diags, Res.getFrontendOpts().ProgramAction, Res.getFrontendOpts()); - ParsePreprocessorOutputArgs(Res.getPreprocessorOutputOpts(), Args, + ParsePreprocessorOutputArgs(Res, Res.getPreprocessorOutputOpts(), Args, Diags, Res.getFrontendOpts().ProgramAction); // Turn on -Wspir-compat for SPIR target. @@ -4380,6 +4441,8 @@ GeneratePreprocessorArgs(*PreprocessorOpts, Args, SA, *LangOpts, FrontendOpts, CodeGenOpts); + GeneratePreprocessorOutputArgs(PreprocessorOutputOpts, Args, SA, + FrontendOpts.ProgramAction); GenerateFrontendArgs(FrontendOpts, Args, SA, LangOpts->IsHeaderFile); GenerateAnalyzerArgs(*AnalyzerOpts, Args, SA); GenerateHeaderSearchArgs(*HeaderSearchOpts, Args, SA); Index: clang/include/clang/Frontend/CompilerInvocation.h =================================================================== --- clang/include/clang/Frontend/CompilerInvocation.h +++ clang/include/clang/Frontend/CompilerInvocation.h @@ -248,6 +248,20 @@ bool parseSimpleArgs(const llvm::opt::ArgList &Args, DiagnosticsEngine &Diags); + // Parse command line options from PreprocessorOutputOptions. + static bool ParsePreprocessorOutputArgs(CompilerInvocation &Res, + PreprocessorOutputOptions &Opts, + llvm::opt::ArgList &Args, + DiagnosticsEngine &Diags, + frontend::ActionKind Action); + + // Generate command line options from PreprocessorOutputOptions. + static void + GeneratePreprocessorOutputArgs(const PreprocessorOutputOptions &Opts, + SmallVectorImpl<const char *> &Args, + StringAllocator SA, + frontend::ActionKind Action); + // Parse command line options that map to FrontendOptions. static bool ParseFrontendArgs(CompilerInvocation &Res, FrontendOptions &Opts, llvm::opt::ArgList &Args, Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -250,7 +250,7 @@ class FrontendOpts<string base> : KeyPathAndMacro<"FrontendOpts.", base, "FRONTEND_"> {} class PreprocessorOutputOpts<string base> - : KeyPathAndMacro<"PreprocessorOutputOpts.", base> {} + : KeyPathAndMacro<"PreprocessorOutputOpts.", base, "PREPROCESSOR_OUTPUT_"> {} class DependencyOutputOpts<string base> : KeyPathAndMacro<"DependencyOutputOpts.", base> {} class CodeGenOpts<string base>
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits