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

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to