diff mbox series

[v2] arm64: Don't unconditionally add -Wno-psabi to KBUILD_CFLAGS

Message ID 20190611171931.99705-1-natechancellor@gmail.com (mailing list archive)
State Mainlined, archived
Commit fa63da2ab046b885a7f70291aafc4e8ce015429b
Headers show
Series [v2] arm64: Don't unconditionally add -Wno-psabi to KBUILD_CFLAGS | expand

Commit Message

Nathan Chancellor June 11, 2019, 5:19 p.m. UTC
This is a GCC only option, which warns about ABI changes within GCC, so
unconditionally adding it breaks Clang with tons of:

warning: unknown warning option '-Wno-psabi' [-Wunknown-warning-option]

and link time failures:

ld.lld: error: undefined symbol: __efistub___stack_chk_guard
>>> referenced by arm-stub.c:73
(/home/nathan/cbl/linux/drivers/firmware/efi/libstub/arm-stub.c:73)
>>>               arm-stub.stub.o:(__efistub_install_memreserve_table)
in archive ./drivers/firmware/efi/libstub/lib.a

These failures come from the lack of -fno-stack-protector, which is
added via cc-option in drivers/firmware/efi/libstub/Makefile. When an
unknown flag is added to KBUILD_CFLAGS, clang will noisily warn that it
is ignoring the option like above, unlike gcc, who will just error.

$ echo "int main() { return 0; }" > tmp.c

$ clang -Wno-psabi tmp.c; echo $?
warning: unknown warning option '-Wno-psabi' [-Wunknown-warning-option]
1 warning generated.
0

$ gcc -Wsometimes-uninitialized tmp.c; echo $?
gcc: error: unrecognized command line option
‘-Wsometimes-uninitialized’; did you mean ‘-Wmaybe-uninitialized’?
1

For cc-option to work properly with clang and behave like gcc, -Werror
is needed, which was done in commit c3f0d0bc5b01 ("kbuild, LLVMLinux:
Add -Werror to cc-option to support clang").

$ clang -Werror -Wno-psabi tmp.c; echo $?
error: unknown warning option '-Wno-psabi'
[-Werror,-Wunknown-warning-option]
1

As a consequence of this, when an unknown flag is unconditionally added
to KBUILD_CFLAGS, it will cause cc-option to always fail and those flags
will never get added:

$ clang -Werror -Wno-psabi -fno-stack-protector tmp.c; echo $?
error: unknown warning option '-Wno-psabi'
[-Werror,-Wunknown-warning-option]
1

This can be seen when compiling the whole kernel as some warnings that
are normally disabled (see below) show up. The full list of flags
missing from drivers/firmware/efi/libstub are the following (gathered
from diffing .arm64-stub.o.cmd):

-fno-delete-null-pointer-checks
-Wno-address-of-packed-member
-Wframe-larger-than=2048
-Wno-unused-const-variable
-fno-strict-overflow
-fno-merge-all-constants
-fno-stack-check
-Werror=date-time
-Werror=incompatible-pointer-types
-ffreestanding
-fno-stack-protector

Use cc-disable-warning so that it gets disabled for GCC and does nothing
for Clang.

Fixes: ebcc5928c5d9 ("arm64: Silence gcc warnings about arch ABI drift")
Link: https://github.com/ClangBuiltLinux/linux/issues/511
Reported-by: Qian Cai <cai@lca.pw>
Acked-by: Dave Martin <Dave.Martin@arm.com>
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
---

v1 -> v2:

* Improve commit message explanation, I wasn't entirely happy with the
  first one; let me know if there are any issues/questions.

* Carry forward Dave's ack and Nick's review (let me know if you
  disagree with the commit messasge rewording).

 arch/arm64/Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Dave Martin June 12, 2019, 9:25 a.m. UTC | #1
On Tue, Jun 11, 2019 at 10:19:32AM -0700, Nathan Chancellor wrote:
> This is a GCC only option, which warns about ABI changes within GCC, so
> unconditionally adding it breaks Clang with tons of:
> 
> warning: unknown warning option '-Wno-psabi' [-Wunknown-warning-option]
> 
> and link time failures:
> 
> ld.lld: error: undefined symbol: __efistub___stack_chk_guard
> >>> referenced by arm-stub.c:73
> (/home/nathan/cbl/linux/drivers/firmware/efi/libstub/arm-stub.c:73)
> >>>               arm-stub.stub.o:(__efistub_install_memreserve_table)
> in archive ./drivers/firmware/efi/libstub/lib.a
> 
> These failures come from the lack of -fno-stack-protector, which is
> added via cc-option in drivers/firmware/efi/libstub/Makefile. When an
> unknown flag is added to KBUILD_CFLAGS, clang will noisily warn that it
> is ignoring the option like above, unlike gcc, who will just error.
> 
> $ echo "int main() { return 0; }" > tmp.c
> 
> $ clang -Wno-psabi tmp.c; echo $?
> warning: unknown warning option '-Wno-psabi' [-Wunknown-warning-option]
> 1 warning generated.
> 0
> 
> $ gcc -Wsometimes-uninitialized tmp.c; echo $?
> gcc: error: unrecognized command line option
> ‘-Wsometimes-uninitialized’; did you mean ‘-Wmaybe-uninitialized’?
> 1
> 
> For cc-option to work properly with clang and behave like gcc, -Werror
> is needed, which was done in commit c3f0d0bc5b01 ("kbuild, LLVMLinux:
> Add -Werror to cc-option to support clang").
> 
> $ clang -Werror -Wno-psabi tmp.c; echo $?
> error: unknown warning option '-Wno-psabi'
> [-Werror,-Wunknown-warning-option]
> 1
> 
> As a consequence of this, when an unknown flag is unconditionally added
> to KBUILD_CFLAGS, it will cause cc-option to always fail and those flags
> will never get added:
> 
> $ clang -Werror -Wno-psabi -fno-stack-protector tmp.c; echo $?
> error: unknown warning option '-Wno-psabi'
> [-Werror,-Wunknown-warning-option]
> 1
> 
> This can be seen when compiling the whole kernel as some warnings that
> are normally disabled (see below) show up. The full list of flags
> missing from drivers/firmware/efi/libstub are the following (gathered
> from diffing .arm64-stub.o.cmd):
> 
> -fno-delete-null-pointer-checks
> -Wno-address-of-packed-member
> -Wframe-larger-than=2048
> -Wno-unused-const-variable
> -fno-strict-overflow
> -fno-merge-all-constants
> -fno-stack-check
> -Werror=date-time
> -Werror=incompatible-pointer-types
> -ffreestanding
> -fno-stack-protector
> 
> Use cc-disable-warning so that it gets disabled for GCC and does nothing
> for Clang.
> 
> Fixes: ebcc5928c5d9 ("arm64: Silence gcc warnings about arch ABI drift")
> Link: https://github.com/ClangBuiltLinux/linux/issues/511
> Reported-by: Qian Cai <cai@lca.pw>
> Acked-by: Dave Martin <Dave.Martin@arm.com>
> Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
> Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
> ---
> 
> v1 -> v2:
> 
> * Improve commit message explanation, I wasn't entirely happy with the
>   first one; let me know if there are any issues/questions.
> 
> * Carry forward Dave's ack and Nick's review (let me know if you
>   disagree with the commit messasge rewording).
> 
>  arch/arm64/Makefile | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
> index 8fbd583b18e1..e9d2e578cbe6 100644
> --- a/arch/arm64/Makefile
> +++ b/arch/arm64/Makefile
> @@ -51,7 +51,7 @@ endif
>  
>  KBUILD_CFLAGS	+= -mgeneral-regs-only $(lseinstr) $(brokengasinst)
>  KBUILD_CFLAGS	+= -fno-asynchronous-unwind-tables
> -KBUILD_CFLAGS	+= -Wno-psabi
> +KBUILD_CFLAGS	+= $(call cc-disable-warning, psabi)
>  KBUILD_AFLAGS	+= $(lseinstr) $(brokengasinst)
>  
>  KBUILD_CFLAGS	+= $(call cc-option,-mabi=lp64)

Looks OK to me.  Thanks for the additional explanation.

Cheers
---Dave
Will Deacon June 12, 2019, 9:33 a.m. UTC | #2
On Wed, Jun 12, 2019 at 10:25:20AM +0100, Dave Martin wrote:
> On Tue, Jun 11, 2019 at 10:19:32AM -0700, Nathan Chancellor wrote:
> > v1 -> v2:
> > 
> > * Improve commit message explanation, I wasn't entirely happy with the
> >   first one; let me know if there are any issues/questions.
> > 
> > * Carry forward Dave's ack and Nick's review (let me know if you
> >   disagree with the commit messasge rewording).
> > 
> >  arch/arm64/Makefile | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
> > index 8fbd583b18e1..e9d2e578cbe6 100644
> > --- a/arch/arm64/Makefile
> > +++ b/arch/arm64/Makefile
> > @@ -51,7 +51,7 @@ endif
> >  
> >  KBUILD_CFLAGS	+= -mgeneral-regs-only $(lseinstr) $(brokengasinst)
> >  KBUILD_CFLAGS	+= -fno-asynchronous-unwind-tables
> > -KBUILD_CFLAGS	+= -Wno-psabi
> > +KBUILD_CFLAGS	+= $(call cc-disable-warning, psabi)
> >  KBUILD_AFLAGS	+= $(lseinstr) $(brokengasinst)
> >  
> >  KBUILD_CFLAGS	+= $(call cc-option,-mabi=lp64)
> 
> Looks OK to me.  Thanks for the additional explanation.

I'd already queued the previous version, but somehow forgotten to push it
out. I'll push this one out instead later today.

Cheers,

Will
diff mbox series

Patch

diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
index 8fbd583b18e1..e9d2e578cbe6 100644
--- a/arch/arm64/Makefile
+++ b/arch/arm64/Makefile
@@ -51,7 +51,7 @@  endif
 
 KBUILD_CFLAGS	+= -mgeneral-regs-only $(lseinstr) $(brokengasinst)
 KBUILD_CFLAGS	+= -fno-asynchronous-unwind-tables
-KBUILD_CFLAGS	+= -Wno-psabi
+KBUILD_CFLAGS	+= $(call cc-disable-warning, psabi)
 KBUILD_AFLAGS	+= $(lseinstr) $(brokengasinst)
 
 KBUILD_CFLAGS	+= $(call cc-option,-mabi=lp64)