>>>>> On Tue, 30 Aug 2005 11:40:56 +0100, Ralf Baechle <ralf@xxxxxxxxxxxxxx> said: > I've rewriten Atushi's fix for the 64-bit put_unaligned on 32-bit > systems bug to generate more efficient code. > This case has buzilla URL http://bugzilla.kernel.org/show_bug.cgi?id=5138. > Signed-off-by: Ralf Baechle <ralf@xxxxxxxxxxxxxx> ... > #define __get_unaligned(ptr, size) ({ \ > const void *__gu_p = ptr; \ > - unsigned long val; \ > + __typeof__(*(ptr)) val; \ > switch (size) { \ > case 1: \ > val = *(const __u8 *)__gu_p; \ It looks gcc 4.x strike back. If the 'ptr' is a const, this code cause "assignment of read-only variable" error on gcc 4.x. Let's step a back, or do you have any other good idea? Use __u64 instead of __typeof__(*(ptr)) for temporary variable to get rid of errors on gcc 4.x. Signed-off-by: Atsushi Nemoto <anemo@xxxxxxxxxxxxx> diff --git a/include/asm-generic/unaligned.h b/include/asm-generic/unaligned.h index 4dc8ddb..09ec447 100644 --- a/include/asm-generic/unaligned.h +++ b/include/asm-generic/unaligned.h @@ -78,7 +78,7 @@ static inline void __ustw(__u16 val, __u #define __get_unaligned(ptr, size) ({ \ const void *__gu_p = ptr; \ - __typeof__(*(ptr)) val; \ + __u64 val; \ switch (size) { \ case 1: \ val = *(const __u8 *)__gu_p; \ @@ -95,7 +95,7 @@ static inline void __ustw(__u16 val, __u default: \ bad_unaligned_access_length(); \ }; \ - val; \ + (__typeof__(*(ptr)))val; \ }) #define __put_unaligned(val, ptr, size) \