diff options
| author | Zhang Rui <rui.zhang@intel.com> | 2015-06-11 12:52:14 +0800 |
|---|---|---|
| committer | Zhang Rui <rui.zhang@intel.com> | 2015-06-11 12:52:14 +0800 |
| commit | 111b23cf895b5cbcdc1b2c6580be1bb78a577d05 (patch) | |
| tree | 89b840115ccd753216ba0b26e587e52699b99310 /include/linux/compiler-gcc.h | |
| parent | 6a6bcf08e5d1834447655a762dfaf552b675cc54 (diff) | |
| parent | 53daf9383f34d7bf61358a37449fb4d59fbdafc2 (diff) | |
Merge branches 'release' and 'thermal-soc' of .git into next
Diffstat (limited to 'include/linux/compiler-gcc.h')
| -rw-r--r-- | include/linux/compiler-gcc.h | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index cdf13ca7cac3..371e560d13cf 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h @@ -9,10 +9,24 @@ + __GNUC_MINOR__ * 100 \ + __GNUC_PATCHLEVEL__) - /* Optimization barrier */ + /* The "volatile" is due to gcc bugs */ #define barrier() __asm__ __volatile__("": : :"memory") +/* + * This version is i.e. to prevent dead stores elimination on @ptr + * where gcc and llvm may behave differently when otherwise using + * normal barrier(): while gcc behavior gets along with a normal + * barrier(), llvm needs an explicit input variable to be assumed + * clobbered. The issue is as follows: while the inline asm might + * access any memory it wants, the compiler could have fit all of + * @ptr into memory registers instead, and since @ptr never escaped + * from that, it proofed that the inline asm wasn't touching any of + * it. This version works well with both compilers, i.e. we're telling + * the compiler that the inline asm absolutely may see the contents + * of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495 + */ +#define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory") /* * This macro obfuscates arithmetic on a variable address so that gcc |
