[PATCH] D83892: [clang][cli] Port CodeGen option flags to new option parsing system

Duncan P. N. Exon Smith via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Dec 1 15:03:06 PST 2020


dexonsmith added a comment.

I think `DefaultsTo{True,False}` and `InvertedBy{Negative,Positive}Flag` makes the axes clear, it's way better; thanks for thinking this through.

Thinking out loud: I'm still a bit resistant to making this keypath-centric. The reason is that `llvm::Option` is a library for command-line options, where command-options are declared, and the "keypath" feature is optional; changing the core concept in clang's usage of `llvm::Option` feels incongruent somehow (especially since clang is the main client). On the other hand (in favour of being keypath-centric), we're bundling multiple command-line options into a single conceptual declaration, doing doing one declaration per keypath. I guess I'm okay with the new semantics. Maybe part of what makes it work is that we're not declaring a "flag" anymore.

That said, I think you can go further:

In D83892#2425437 <https://reviews.llvm.org/D83892#2425437>, @jansvoboda11 wrote:

>   defm inline_line_tables : BoolGOption<DefaultsToFalse, InvertedByNegativeFlag,
>     "inline-line-tables", "CodeGenOpts.NoInlineLineTables", PositiveFlag<>,
>     NegativeFlag<[CC1Option], "Don't emit inline line tables">, BothFlags<[CoreOption]>>;

If this is keypath-centric, then a better name for the declaration would be `no_inline_line_tables`, which matches the keypath. This gives:

  defm no_inline_line_tables : BoolOption<DefaultsToFalse, InvertedByNegativeFlag,
    "inline-line-tables", "CodeGenOpts.NoInlineLineTables", PositiveFlag<>,
    NegativeFlag<[CC1Option], "Don't emit inline line tables">, BothFlags<[CoreOption]>>;

... which doesn't seem quite right yet, since the keypath isn't front and centre.

Here's an idea that's a bit more keypath-centric, that connects the polarity of the option with the option spelling, and that avoids some of the repetitive clutter (I added `-something` to show the positive case):

  defm no_inline_line_tables : BoolOption<"CodeGenOpts.NoInlineLineTables", DefaultsToFalse,
    ChangedByFlag_No<"inline-line-tables", [CC1Option, CoreOption],
                     "Don't emit inline line tables">,
    CancelFlag<[CoreOption]>>;
  
  defm something : BoolOption<"CodeGenOpts.Something", DefaultsToFalse,
    ChangedByFlag<"something", [CC1Option,CoreOption], "Do something">,
    CancelFlag<[CoreOption]>>;

This is similar, but might be easier to implement:

  defm no_inline_line_tables : BoolOption<"CodeGenOpts.NoInlineLineTables", DefaultsToFalse,
    ChangedBy_No<"inline-line-tables", [CC1Option, CoreOption], [CoreOption],
                 "Don't emit inline line tables">>;
  
  defm something : BoolOption<"CodeGenOpts.Something", DefaultsToFalse,
    ChangedBy<"something", [CC1Option,CoreOption], [CoreOption],
              "Do something">>;

I think both of these syntaxes allow you to think primarily about the keypath and the matching flag.

WDYT?



================
Comment at: clang/include/clang/Driver/Options.td:268
+// (Autolink == true) and disabled by -fno-autolink (Autolink == false).
+// todo: add ImpliedByAnyOf if necessary
+multiclass OptOutPositiveFFlag<string name, string pos_prefix, string neg_prefix,
----------------
Since you're planning to leave this to-do behind, I have a few nits:

- I think it should be capitalized (`TODO:`) since I feel like I've seen that more often here.
- It should probably be its own paragraph.
- Complete sentences are a bit nicer (start with a capital and end with a period).
- The wording "if necessary" suggests we don't know if we'll need to do this, in which case having a to-do would just be adding noise. But as you mentioned we do know. I think it's better to be clear about it.
```
// TODO: Add support for ImpliedByAnyOf once it can be
// tested with an option that depends on it.
```


================
Comment at: clang/include/clang/Driver/Options.td:293
                MarshallingInfoFlag<keypath, "false">,
                ImpliedByAnyOf<disablers, "true">;
 }
----------------
jansvoboda11 wrote:
> dexonsmith wrote:
> > Should the new `OptOutPositiveFFlag` have disablers as well?
> Probably yes, it's mentioned in a todo above. I wanted to add this only when an option needs it, to minimize untested code paths.
Ah, thanks, missed that.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D83892/new/

https://reviews.llvm.org/D83892



More information about the cfe-commits mailing list