Raise the minimum required gcc version to 4.6
Various architectures fail to build properly with older versions of the gcc compiler. An example from Guenter Roeck in thread [1]: > > In file included from ./include/linux/mm.h:17:0, > from ./include/linux/pid_namespace.h:7, > from ./include/linux/ptrace.h:10, > from arch/openrisc/kernel/asm-offsets.c:32: > ./include/linux/mm_types.h:497:16: error: flexible array member in otherwise empty struct > > This is just an example with gcc 4.5.1 for or32. I have seen the problem > with gcc 4.4 (for unicore32) as well. So update the minimum required version of gcc to 4.6. [1] https://lore.kernel.org/lkml/20180814170904.GA12768@roeck-us.net/ Miscellanea: - Update Documentation/process/changes.rst - Remove and consolidate version test blocks in compiler-gcc.h for versions lower than 4.6 Signed-off-by: Joe Perches <joe@perches.com> Reviewed-by: Kees Cook <keescook@chromium.org> Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
cc26ebbebd
Коммит
cafa0010cd
|
@ -29,7 +29,7 @@ you probably needn't concern yourself with isdn4k-utils.
|
||||||
====================== =============== ========================================
|
====================== =============== ========================================
|
||||||
Program Minimal version Command to check the version
|
Program Minimal version Command to check the version
|
||||||
====================== =============== ========================================
|
====================== =============== ========================================
|
||||||
GNU C 3.2 gcc --version
|
GNU C 4.6 gcc --version
|
||||||
GNU make 3.81 make --version
|
GNU make 3.81 make --version
|
||||||
binutils 2.20 ld -v
|
binutils 2.20 ld -v
|
||||||
flex 2.5.35 flex --version
|
flex 2.5.35 flex --version
|
||||||
|
|
|
@ -10,6 +10,10 @@
|
||||||
+ __GNUC_MINOR__ * 100 \
|
+ __GNUC_MINOR__ * 100 \
|
||||||
+ __GNUC_PATCHLEVEL__)
|
+ __GNUC_PATCHLEVEL__)
|
||||||
|
|
||||||
|
#if GCC_VERSION < 40600
|
||||||
|
# error Sorry, your compiler is too old - please upgrade it.
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Optimization barrier */
|
/* Optimization barrier */
|
||||||
|
|
||||||
/* The "volatile" is due to gcc bugs */
|
/* The "volatile" is due to gcc bugs */
|
||||||
|
@ -58,6 +62,12 @@
|
||||||
#define OPTIMIZER_HIDE_VAR(var) \
|
#define OPTIMIZER_HIDE_VAR(var) \
|
||||||
__asm__ ("" : "=r" (var) : "0" (var))
|
__asm__ ("" : "=r" (var) : "0" (var))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A trick to suppress uninitialized variable warning without generating any
|
||||||
|
* code
|
||||||
|
*/
|
||||||
|
#define uninitialized_var(x) x = x
|
||||||
|
|
||||||
#ifdef __CHECKER__
|
#ifdef __CHECKER__
|
||||||
#define __must_be_array(a) 0
|
#define __must_be_array(a) 0
|
||||||
#else
|
#else
|
||||||
|
@ -91,7 +101,7 @@
|
||||||
* A lot of inline functions can cause havoc with function tracing.
|
* A lot of inline functions can cause havoc with function tracing.
|
||||||
*/
|
*/
|
||||||
#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \
|
#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \
|
||||||
!defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4)
|
!defined(CONFIG_OPTIMIZE_INLINING)
|
||||||
#define inline \
|
#define inline \
|
||||||
inline __attribute__((always_inline, unused)) notrace __gnu_inline
|
inline __attribute__((always_inline, unused)) notrace __gnu_inline
|
||||||
#else
|
#else
|
||||||
|
@ -147,47 +157,13 @@
|
||||||
#define __always_unused __attribute__((unused))
|
#define __always_unused __attribute__((unused))
|
||||||
#define __mode(x) __attribute__((mode(x)))
|
#define __mode(x) __attribute__((mode(x)))
|
||||||
|
|
||||||
/* gcc version specific checks */
|
|
||||||
|
|
||||||
#if GCC_VERSION < 30200
|
|
||||||
# error Sorry, your compiler is too old - please upgrade it.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if GCC_VERSION < 30300
|
|
||||||
# define __used __attribute__((__unused__))
|
|
||||||
#else
|
|
||||||
# define __used __attribute__((__used__))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_GCOV_KERNEL
|
|
||||||
# if GCC_VERSION < 30400
|
|
||||||
# error "GCOV profiling support for gcc versions below 3.4 not included"
|
|
||||||
# endif /* __GNUC_MINOR__ */
|
|
||||||
#endif /* CONFIG_GCOV_KERNEL */
|
|
||||||
|
|
||||||
#if GCC_VERSION >= 30400
|
|
||||||
#define __must_check __attribute__((warn_unused_result))
|
#define __must_check __attribute__((warn_unused_result))
|
||||||
#define __malloc __attribute__((__malloc__))
|
#define __malloc __attribute__((__malloc__))
|
||||||
#endif
|
|
||||||
|
|
||||||
#if GCC_VERSION >= 40000
|
|
||||||
|
|
||||||
/* GCC 4.1.[01] miscompiles __weak */
|
|
||||||
#ifdef __KERNEL__
|
|
||||||
# if GCC_VERSION >= 40100 && GCC_VERSION <= 40101
|
|
||||||
# error Your version of gcc miscompiles the __weak directive
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define __used __attribute__((__used__))
|
#define __used __attribute__((__used__))
|
||||||
#define __compiler_offsetof(a, b) \
|
#define __compiler_offsetof(a, b) \
|
||||||
__builtin_offsetof(a, b)
|
__builtin_offsetof(a, b)
|
||||||
|
|
||||||
#if GCC_VERSION >= 40100
|
|
||||||
# define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if GCC_VERSION >= 40300
|
|
||||||
/* Mark functions as cold. gcc will assume any path leading to a call
|
/* Mark functions as cold. gcc will assume any path leading to a call
|
||||||
* to them will be unlikely. This means a lot of manual unlikely()s
|
* to them will be unlikely. This means a lot of manual unlikely()s
|
||||||
* are unnecessary now for any paths leading to the usual suspects
|
* are unnecessary now for any paths leading to the usual suspects
|
||||||
|
@ -206,24 +182,19 @@
|
||||||
|
|
||||||
#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
|
#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
|
||||||
|
|
||||||
#ifndef __CHECKER__
|
|
||||||
# define __compiletime_warning(message) __attribute__((warning(message)))
|
|
||||||
# define __compiletime_error(message) __attribute__((error(message)))
|
|
||||||
#endif /* __CHECKER__ */
|
|
||||||
#endif /* GCC_VERSION >= 40300 */
|
|
||||||
|
|
||||||
#if GCC_VERSION >= 40400
|
|
||||||
#define __optimize(level) __attribute__((__optimize__(level)))
|
#define __optimize(level) __attribute__((__optimize__(level)))
|
||||||
#define __nostackprotector __optimize("no-stack-protector")
|
#define __nostackprotector __optimize("no-stack-protector")
|
||||||
#endif /* GCC_VERSION >= 40400 */
|
|
||||||
|
|
||||||
#if GCC_VERSION >= 40500
|
#define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
|
||||||
|
|
||||||
#ifndef __CHECKER__
|
#ifndef __CHECKER__
|
||||||
|
#define __compiletime_warning(message) __attribute__((warning(message)))
|
||||||
|
#define __compiletime_error(message) __attribute__((error(message)))
|
||||||
|
|
||||||
#ifdef LATENT_ENTROPY_PLUGIN
|
#ifdef LATENT_ENTROPY_PLUGIN
|
||||||
#define __latent_entropy __attribute__((latent_entropy))
|
#define __latent_entropy __attribute__((latent_entropy))
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif /* __CHECKER__ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* calling noreturn functions, __builtin_unreachable() and __builtin_trap()
|
* calling noreturn functions, __builtin_unreachable() and __builtin_trap()
|
||||||
|
@ -261,10 +232,6 @@
|
||||||
#define randomized_struct_fields_end } __randomize_layout;
|
#define randomized_struct_fields_end } __randomize_layout;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* GCC_VERSION >= 40500 */
|
|
||||||
|
|
||||||
#if GCC_VERSION >= 40600
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When used with Link Time Optimization, gcc can optimize away C functions or
|
* When used with Link Time Optimization, gcc can optimize away C functions or
|
||||||
* variables which are referenced only from assembly code. __visible tells the
|
* variables which are referenced only from assembly code. __visible tells the
|
||||||
|
@ -273,8 +240,7 @@
|
||||||
*/
|
*/
|
||||||
#define __visible __attribute__((externally_visible))
|
#define __visible __attribute__((externally_visible))
|
||||||
|
|
||||||
#endif /* GCC_VERSION >= 40600 */
|
/* gcc version specific checks */
|
||||||
|
|
||||||
|
|
||||||
#if GCC_VERSION >= 40900 && !defined(__CHECKER__)
|
#if GCC_VERSION >= 40900 && !defined(__CHECKER__)
|
||||||
/*
|
/*
|
||||||
|
@ -308,10 +274,8 @@
|
||||||
* folding in __builtin_bswap*() (yet), so don't set these for it.
|
* folding in __builtin_bswap*() (yet), so don't set these for it.
|
||||||
*/
|
*/
|
||||||
#if defined(CONFIG_ARCH_USE_BUILTIN_BSWAP) && !defined(__CHECKER__)
|
#if defined(CONFIG_ARCH_USE_BUILTIN_BSWAP) && !defined(__CHECKER__)
|
||||||
#if GCC_VERSION >= 40400
|
|
||||||
#define __HAVE_BUILTIN_BSWAP32__
|
#define __HAVE_BUILTIN_BSWAP32__
|
||||||
#define __HAVE_BUILTIN_BSWAP64__
|
#define __HAVE_BUILTIN_BSWAP64__
|
||||||
#endif
|
|
||||||
#if GCC_VERSION >= 40800
|
#if GCC_VERSION >= 40800
|
||||||
#define __HAVE_BUILTIN_BSWAP16__
|
#define __HAVE_BUILTIN_BSWAP16__
|
||||||
#endif
|
#endif
|
||||||
|
@ -340,10 +304,9 @@
|
||||||
* https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
|
* https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
|
||||||
*/
|
*/
|
||||||
#define __designated_init __attribute__((designated_init))
|
#define __designated_init __attribute__((designated_init))
|
||||||
|
#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* gcc version >= 40000 specific checks */
|
|
||||||
|
|
||||||
#if !defined(__noclone)
|
#if !defined(__noclone)
|
||||||
#define __noclone /* not needed */
|
#define __noclone /* not needed */
|
||||||
#endif
|
#endif
|
||||||
|
@ -352,16 +315,6 @@
|
||||||
#define __no_sanitize_address
|
#define __no_sanitize_address
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* A trick to suppress uninitialized variable warning without generating any
|
|
||||||
* code
|
|
||||||
*/
|
|
||||||
#define uninitialized_var(x) x = x
|
|
||||||
|
|
||||||
#if GCC_VERSION >= 50100
|
|
||||||
#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Turn individual warnings and errors on and off locally, depending
|
* Turn individual warnings and errors on and off locally, depending
|
||||||
* on version.
|
* on version.
|
||||||
|
@ -374,12 +327,9 @@
|
||||||
#define __diag_GCC_warn warning
|
#define __diag_GCC_warn warning
|
||||||
#define __diag_GCC_error error
|
#define __diag_GCC_error error
|
||||||
|
|
||||||
/* Compilers before gcc-4.6 do not understand "#pragma GCC diagnostic push" */
|
|
||||||
#if GCC_VERSION >= 40600
|
|
||||||
#define __diag_str1(s) #s
|
#define __diag_str1(s) #s
|
||||||
#define __diag_str(s) __diag_str1(s)
|
#define __diag_str(s) __diag_str1(s)
|
||||||
#define __diag(s) _Pragma(__diag_str(GCC diagnostic s))
|
#define __diag(s) _Pragma(__diag_str(GCC diagnostic s))
|
||||||
#endif
|
|
||||||
|
|
||||||
#if GCC_VERSION >= 80000
|
#if GCC_VERSION >= 80000
|
||||||
#define __diag_GCC_8(s) __diag(s)
|
#define __diag_GCC_8(s) __diag(s)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче