From b90a4abbe075487ba369c96b744739948cc355e5 Mon Sep 17 00:00:00 2001 From: Oliver Smith Date: Fri, 5 Oct 2018 08:00:26 +0200 Subject: [PATCH] add shared patches for GCC8 compatibility This introduces a new .shared-patches folder. New "pmbootstrap aportgen" code will make use of this, and create symlinks to the patches inside that folder when running "pmbootstrap aportgen linux-..." (or using the new device wizard). --- ...give-up-on-ilog2-const-optimizations.patch | 90 +++++++++++++++++++ .shared-patches/linux/gcc8-fix-put-user.patch | 45 ++++++++++ 2 files changed, 135 insertions(+) create mode 100644 .shared-patches/linux/gcc7-give-up-on-ilog2-const-optimizations.patch create mode 100644 .shared-patches/linux/gcc8-fix-put-user.patch diff --git a/.shared-patches/linux/gcc7-give-up-on-ilog2-const-optimizations.patch b/.shared-patches/linux/gcc7-give-up-on-ilog2-const-optimizations.patch new file mode 100644 index 000000000..c02fc7be1 --- /dev/null +++ b/.shared-patches/linux/gcc7-give-up-on-ilog2-const-optimizations.patch @@ -0,0 +1,90 @@ +From a7bfe0a2832e66f3d732e4210b5d53c81cc7a85f Mon Sep 17 00:00:00 2001 +From: Linus Torvalds +Date: Thu, 27 Sep 2018 19:16:56 -0400 +Subject: [PATCH] give up on gcc ilog2() constant optimizations + +commit 474c90156c8dcc2fa815e6716cc9394d7930cb9c upstream. + +gcc-7 has an "optimization" pass that completely screws up, and +generates the code expansion for the (impossible) case of calling +ilog2() with a zero constant, even when the code gcc compiles does not +actually have a zero constant. + +And we try to generate a compile-time error for anybody doing ilog2() on +a constant where that doesn't make sense (be it zero or negative). So +now gcc7 will fail the build due to our sanity checking, because it +created that constant-zero case that didn't actually exist in the source +code. + +There's a whole long discussion on the kernel mailing about how to work +around this gcc bug. The gcc people themselevs have discussed their +"feature" in + + https://gcc.gnu.org/bugzilla/show_bug.cgi?id=72785 + +but it's all water under the bridge, because while it looked at one +point like it would be solved by the time gcc7 was released, that was +not to be. + +So now we have to deal with this compiler braindamage. + +And the only simple approach seems to be to just delete the code that +tries to warn about bad uses of ilog2(). + +So now "ilog2()" will just return 0 not just for the value 1, but for +any non-positive value too. + +It's not like I can recall anybody having ever actually tried to use +this function on any invalid value, but maybe the sanity check just +meant that such code never made it out in public. + +[js] no tools/include/linux/log2.h copy of that yet + +Reported-by: Laura Abbott +Cc: John Stultz , +Cc: Thomas Gleixner +Cc: Ard Biesheuvel +Signed-off-by: Linus Torvalds +Signed-off-by: Jiri Slaby +--- + include/linux/log2.h | 13 ++----------- + 1 file changed, 2 insertions(+), 11 deletions(-) + +diff --git a/include/linux/log2.h b/include/linux/log2.h +index fd7ff3d91..f38fae23b 100644 +--- a/include/linux/log2.h ++++ b/include/linux/log2.h +@@ -15,12 +15,6 @@ + #include + #include + +-/* +- * deal with unrepresentable constant logarithms +- */ +-extern __attribute__((const, noreturn)) +-int ____ilog2_NaN(void); +- + /* + * non-constant log of base 2 calculators + * - the arch may override these in asm/bitops.h if they can be implemented +@@ -85,7 +79,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n) + #define ilog2(n) \ + ( \ + __builtin_constant_p(n) ? ( \ +- (n) < 1 ? ____ilog2_NaN() : \ ++ (n) < 2 ? 0 : \ + (n) & (1ULL << 63) ? 63 : \ + (n) & (1ULL << 62) ? 62 : \ + (n) & (1ULL << 61) ? 61 : \ +@@ -148,10 +142,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n) + (n) & (1ULL << 4) ? 4 : \ + (n) & (1ULL << 3) ? 3 : \ + (n) & (1ULL << 2) ? 2 : \ +- (n) & (1ULL << 1) ? 1 : \ +- (n) & (1ULL << 0) ? 0 : \ +- ____ilog2_NaN() \ +- ) : \ ++ 1 ) : \ + (sizeof(n) <= 4) ? \ + __ilog2_u32(n) : \ + __ilog2_u64(n) \ diff --git a/.shared-patches/linux/gcc8-fix-put-user.patch b/.shared-patches/linux/gcc8-fix-put-user.patch new file mode 100644 index 000000000..6ccda7f1e --- /dev/null +++ b/.shared-patches/linux/gcc8-fix-put-user.patch @@ -0,0 +1,45 @@ +From 8c8187d41b99acd4f2078d0fff6807e0eeb47407 Mon Sep 17 00:00:00 2001 +From: Arnd Bergmann +Date: Thu, 26 Jul 2018 10:13:23 +0200 +Subject: [PATCH] ARM: fix put_user() for gcc-8 + +Building kernels before linux-4.7 with gcc-8 results in many build failures +when gcc triggers a check that was meant to catch broken compilers: + +/tmp/ccCGMQmS.s:648: Error: .err encountered + +According to the discussion in the gcc bugzilla, a local "register +asm()" variable is still supposed to be the correct way to force an +inline assembly to use a particular register, but marking it 'const' +lets the compiler do optimizations that break that, i.e the compiler is +free to treat the variable as either 'const' or 'register' in that case. + +Upstream commit 9f73bd8bb445 ("ARM: uaccess: remove put_user() code +duplication") fixed this problem in linux-4.8 as part of a larger change, +but seems a little too big to be backported to 4.4. + +Let's take the simplest fix and change only the one broken line in the +same way as newer kernels. + +Suggested-by: Bernd Edlinger +Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85745 +Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86673 +Signed-off-by: Arnd Bergmann +Signed-off-by: Greg Kroah-Hartman +--- + arch/arm/include/asm/uaccess.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h +index 292c3f88f..48decaa00 100644 +--- a/arch/arm/include/asm/uaccess.h ++++ b/arch/arm/include/asm/uaccess.h +@@ -158,7 +158,7 @@ extern int __put_user_8(void *, unsigned long long); + #define put_user(x,p) \ + ({ \ + unsigned long __limit = current_thread_info()->addr_limit - 1; \ +- register const typeof(*(p)) __r2 asm("r2") = (x); \ ++ register typeof(*(p)) __r2 asm("r2") = (x); \ + register const typeof(*(p)) __user *__p asm("r0") = (p);\ + register unsigned long __l asm("r1") = __limit; \ + register int __e asm("r0"); \