[clang] cc1: Report an error for multiple actions unless separated by -main-file-name (PR #91140)

Justin Bogner via cfe-commits cfe-commits at lists.llvm.org
Tue May 28 10:21:57 PDT 2024


bogner wrote:

> > I don't really understand the rationale for this, and it's kind of annoying. Most of the compiler's flags behave in the "last one wins" fashion (such as `-O2` and `-O0`) and it's always been convenient to add the flag you want at the end. Why treat action flags any differently? Also, even if this is worthwhile for some reason I haven't considered, why is it an error rather than a warning?
> 
> @bogner Some action options are shared between driver and cc1 but the behaviors could be quite different. See my example in the description.
> 
> ```
> %clang_cc1 -S -emit-llvm a.c     # -S is overridden
> %clang_cc1 -emit-llvm -S a.c     # -emit-llvm is overridden
> %clang_cc1 -fsyntax-only -S a.c  # -fsyntax-only is overridden
> ```
> 
> The strictness helps ensure that `%clang_cc1` tests do not have misleading, overridden action options.

So the oddity here really is the driver, which translates both `-S -emit-llvm` and `-emit-llvm -S` to `-emit-llvm-bc` in the `-cc1` invocation. Before this change the cc1 invocation treated `-S` and the various `-emit-XYZ` flags consistently with other options like `-O`, `-g`, and most `-f` group flags, letting later ones override earlier.

I suppose that it's somewhat reasonable to warn users that `-cc1` behaves differently than the driver for certain combinations of `-S` and `-emit-llvm`, and it's probably too impactful of a change to change the driver. Even so, I really think this should just be a warning and not a hard error.

https://github.com/llvm/llvm-project/pull/91140


More information about the cfe-commits mailing list