Commit 5fc4d839 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] ECC support

From: "Nakajima, Jun" <jun.nakajima@intel.com>

Split the increasingly messy compiler.h file into per-compiler files and also
add support for non-gcc compilers.  

With the current implementation:

  include/linux/compiler.h defines the compiler-dependent abstractions
  which can be overwritten by per-compiler definitions.

  include/linux/compiler-gcc.h contains the common definitions for all gcc
  versions.

  include/linux/compiler-gcc[2,3,+].h contains gcc major version specific
  definitions.

  include/linux/compiler-intel.h contains intel compiler specific
  definitions."
parent 0bfc934b
/* Never include this file directly. Include <linux/compiler.h> instead. */
/*
* These definitions are for Ueber-GCC: always newer than the latest
* version and hence sporting everything plus a kitchen-sink.
*/
#include <linux/compiler-gcc.h>
#define inline __inline__ __attribute__((always_inline))
#define __inline__ __inline__ __attribute__((always_inline))
#define __inline __inline__ __attribute__((always_inline))
#define __deprecated __attribute__((deprecated))
#define __attribute_used__ __attribute__((__used__))
#define __attribute_pure__ __attribute__((pure))
/* Never include this file directly. Include <linux/compiler.h> instead. */
/*
* Common definitions for all gcc versions go here.
*/
/* Optimization barrier */
/* The "volatile" is due to gcc bugs */
#define barrier() __asm__ __volatile__("": : :"memory")
/* This macro obfuscates arithmetic on a variable address so that gcc
shouldn't recognize the original var, and make assumptions about it */
#define RELOC_HIDE(ptr, off) \
({ unsigned long __ptr; \
__asm__ ("" : "=g"(__ptr) : "0"(ptr)); \
(typeof(ptr)) (__ptr + (off)); })
/* Never include this file directly. Include <linux/compiler.h> instead. */
/* These definitions are for GCC v2.x. */
/* Somewhere in the middle of the GCC 2.96 development cycle, we implemented
a mechanism by which the user can annotate likely branch directions and
expect the blocks to be reordered appropriately. Define __builtin_expect
to nothing for earlier compilers. */
#include <linux/compiler-gcc.h>
#if __GNUC_MINOR__ < 96
# define __builtin_expect(x, expected_value) (x)
#endif
#define __attribute_used__ __attribute__((__unused__))
/*
* The attribute `pure' is not implemented in GCC versions earlier
* than 2.96.
*/
#if __GNUC_MINOR__ >= 96
# define __attribute_pure__ __attribute__((pure))
#endif
/* Never include this file directly. Include <linux/compiler.h> instead. */
/* These definitions are for GCC v3.x. */
#include <linux/compiler-gcc.h>
#if __GNUC_MINOR__ >= 1
# define inline __inline__ __attribute__((always_inline))
# define __inline__ __inline__ __attribute__((always_inline))
# define __inline __inline__ __attribute__((always_inline))
#endif
#if __GNUC_MINOR__ > 0
# define __deprecated __attribute__((deprecated))
#endif
#if __GNUC_MINOR__ >= 3
# define __attribute_used__ __attribute__((__used__))
#else
# define __attribute_used__ __attribute__((__unused__))
#endif
#define __attribute_pure__ __attribute__((pure))
/* Never include this file directly. Include <linux/compiler.h> instead. */
#ifdef __ECC
/* Some compiler specific definitions are overwritten here
* for Intel ECC compiler
*/
#include <asm/intrinsics.h>
/* Intel ECC compiler doesn't support gcc specific asm stmts.
* It uses intrinsics to do the equivalent things.
*/
#undef barrier
#undef RELOC_HIDE
#define barrier() __memory_barrier()
#define RELOC_HIDE(ptr, off) \
({ unsigned long __ptr; \
__ptr = (unsigned long) (ptr); \
(typeof(ptr)) (__ptr + (off)); })
#endif
...@@ -2,28 +2,36 @@ ...@@ -2,28 +2,36 @@
#define __LINUX_COMPILER_H #define __LINUX_COMPILER_H
#ifdef __CHECKER__ #ifdef __CHECKER__
#define __user __attribute__((noderef, address_space(1))) # define __user __attribute__((noderef, address_space(1)))
#define __kernel /* default address space */ # define __kernel /* default address space */
#else #else
#define __user # define __user
#define __kernel # define __kernel
#endif #endif
#if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) #if __GNUC__ > 3
#define inline __inline__ __attribute__((always_inline)) # include <linux/compiler-gcc+.h> /* catch-all for GCC 4, 5, etc. */
#define __inline__ __inline__ __attribute__((always_inline)) #elif __GNUC__ == 3
#define __inline __inline__ __attribute__((always_inline)) # include <linux/compiler-gcc3.h>
#elif __GNUC__ == 2
# include <linux/compiler-gcc2.h>
#else
# error Sorry, your compiler is too old/not recognized.
#endif #endif
/* Somewhere in the middle of the GCC 2.96 development cycle, we implemented /* Intel compiler defines __GNUC__. So we will overwrite implementations
a mechanism by which the user can annotate likely branch directions and * coming from above header files here
expect the blocks to be reordered appropriately. Define __builtin_expect */
to nothing for earlier compilers. */ #ifdef __INTEL_COMPILER
# include <linux/compiler-intel.h>
#if __GNUC__ == 2 && __GNUC_MINOR__ < 96
#define __builtin_expect(x, expected_value) (x)
#endif #endif
/*
* Generic compiler-dependent macros required for kernel
* build go below this comment. Actual compiler/compiler version
* specific implementations come from the above header files
*/
#define likely(x) __builtin_expect(!!(x), 1) #define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0) #define unlikely(x) __builtin_expect(!!(x), 0)
...@@ -33,10 +41,8 @@ ...@@ -33,10 +41,8 @@
* Usage is: * Usage is:
* int __deprecated foo(void) * int __deprecated foo(void)
*/ */
#if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3 #ifndef __deprecated
#define __deprecated __attribute__((deprecated)) # define __deprecated /* unimplemented */
#else
#define __deprecated
#endif #endif
/* /*
...@@ -50,10 +56,8 @@ ...@@ -50,10 +56,8 @@
* In prior versions of gcc, such functions and data would be emitted, but * In prior versions of gcc, such functions and data would be emitted, but
* would be warned about except with attribute((unused)). * would be warned about except with attribute((unused)).
*/ */
#if __GNUC__ == 3 && __GNUC_MINOR__ >= 3 || __GNUC__ > 3 #ifndef __attribute_used__
#define __attribute_used__ __attribute__((__used__)) # define __attribute_used__ /* unimplemented */
#else
#define __attribute_used__ __attribute__((__unused__))
#endif #endif
/* /*
...@@ -65,19 +69,21 @@ ...@@ -65,19 +69,21 @@
* elimination and loop optimization just as an arithmetic operator * elimination and loop optimization just as an arithmetic operator
* would be. * would be.
* [...] * [...]
* The attribute `pure' is not implemented in GCC versions earlier
* than 2.96.
*/ */
#if (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || __GNUC__ > 2 #ifndef __attribute_pure__
#define __attribute_pure__ __attribute__((pure)) # define __attribute_pure__ /* unimplemented */
#else #endif
#define __attribute_pure__ /* unimplemented */
/* Optimization barrier */
#ifndef barrier
# define barrier() __memory_barrier()
#endif #endif
/* This macro obfuscates arithmetic on a variable address so that gcc #ifndef RELOC_HIDE
shouldn't recognize the original var, and make assumptions about it */ # define RELOC_HIDE(ptr, off) \
#define RELOC_HIDE(ptr, off) \
({ unsigned long __ptr; \ ({ unsigned long __ptr; \
__asm__ ("" : "=g"(__ptr) : "0"(ptr)); \ __ptr = (unsigned long) (ptr); \
(typeof(ptr)) (__ptr + (off)); }) (typeof(ptr)) (__ptr + (off)); })
#endif
#endif /* __LINUX_COMPILER_H */ #endif /* __LINUX_COMPILER_H */
...@@ -15,10 +15,6 @@ ...@@ -15,10 +15,6 @@
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <asm/bug.h> #include <asm/bug.h>
/* Optimization barrier */
/* The "volatile" is due to gcc bugs */
#define barrier() __asm__ __volatile__("": : :"memory")
#define INT_MAX ((int)(~0U>>1)) #define INT_MAX ((int)(~0U>>1))
#define INT_MIN (-INT_MAX - 1) #define INT_MIN (-INT_MAX - 1)
#define UINT_MAX (~0U) #define UINT_MAX (~0U)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment