[PATCH] D91861: [clang][cli] Split DefaultAnyOf into a default value and ImpliedByAnyOf
Duncan P. N. Exon Smith via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 30 07:01:24 PST 2020
dexonsmith added inline comments.
================
Comment at: clang/lib/Frontend/CompilerInvocation.cpp:4027-4031
+ if (((FLAGS)&options::CC1Option) && \
+ (ALWAYS_EMIT || \
+ (EXTRACTOR(this->KEYPATH) != DEFAULT_VALUE && !(IMPLIED_CHECK)))) { \
DENORMALIZER(Args, SPELLING, SA, TABLE_INDEX, EXTRACTOR(this->KEYPATH)); \
}
----------------
jansvoboda11 wrote:
> jansvoboda11 wrote:
> > dexonsmith wrote:
> > > I'm not sure this logic is quite right. It looks to me like if an option can very be implied, it will never be seriazed to `-cc1`, even if its current value is not an implied one.
> > >
> > > Or have I understood the conditions under which `IMPLIED_CHECK` returns `true`?
> > >
> > > IIUC, then this logic seems closer:
> > > ```
> > > if (((FLAGS)&options::CC1Option) && \
> > > (ALWAYS_EMIT || \
> > > (EXTRACTOR(this->KEYPATH) != \
> > > (IMPLIED_CHECK ? (DEFAULT_VALUE) \
> > > : (MERGER(DEFAULT_VALUE, IMPLIED_VALUE)))))) { \
> > > DENORMALIZER(Args, SPELLING, SA, TABLE_INDEX, EXTRACTOR(this->KEYPATH)); \
> > > }
> > > ```
> > >
> > > It would be great to see tests in particular for a bitset (or similar) option where the merger does a union.
> > `IMPLIED_CHECK` is a logical disjunction of the implying option keypaths. It evaluates to `true` whenever at least one of the implying keypaths evaluates to `true`.
> >
> > I think I know what you're concerned about. Let me paraphrase it and check if my understanding is correct:
> > Suppose option `a` has default value of `x`, and flag `b` can imply the value of `a` to be `y`. If we have a command line `-b -a=z`, then `-a=z` would not be generated with the current logic: `EXTRACTOR(this->KEYPATH) != DEFAULT_VALUE` evaluates to true, but `!(IMPLIED_CHECK)` to `false`.
> >
> > Your conditions gets close, but I think the ternary branches should be the other way around.
> >
> > Here's a table exploring all cases:
> >
> > ```
> > IMPLIED_CHECK | EXTRACTOR(this->KEYPATH) == | SHOULD_EMIT
> > --------------+-----------------------------+-----------------------------------------
> > true | IMPLIED_VALUE | NO - emitting only the implying option is enough
> > true | DEFAULT_VALUE | YES - value explicitly specified (and it's DEFAULT_VALUE just by chance)
> > true | ??? | YES - value explicitly specified
> > false | IMPLIED_VALUE | YES - value explicitly specified (and it's IMPLIED_VALUE just by chance)
> > false | DEFAULT_VALUE | NO - default value handles this automatically
> > false | ??? | YES - value explicitly specified
> > ```
> >
> > I think this logic is what we're looking for:
> >
> > ```
> > if (((FLAGS)&options::CC1Option) && \
> > (ALWAYS_EMIT || \
> > (EXTRACTOR(this->KEYPATH) != \
> > ((IMPLIED_CHECK) ? (IMPLIED_VALUE) : (DEFAULT_VALUE))))) { \
> > DENORMALIZER(Args, SPELLING, SA, TABLE_INDEX, EXTRACTOR(this->KEYPATH)); \
> > }
> > ```
> It would be great to be able to test this logic even when no Clang options exercise it properly yet. Any ideas on that front?
> Including a different `Options.inc` in `CompilerInvocation.cpp` for tests and re-linking the whole library seems wasteful.
That'd be great, but I don't see a simple way. Can you find a flag that would exercise it properly? If so, I suggest converting just that one flag as part of this patch, and then you can test it.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D91861/new/
https://reviews.llvm.org/D91861
More information about the llvm-commits
mailing list