Gitweb: http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=60262e58e305f27d05eefeda172117521514f364 Commit: 60262e58e305f27d05eefeda172117521514f364 Parent: e7cf261b447ed7edbf7c10c046e078bda799afaf Author: Al Viro <[EMAIL PROTECTED]> AuthorDate: Thu Jul 26 17:46:19 2007 +0100 Committer: Linus Torvalds <[EMAIL PROTECTED]> CommitDate: Thu Jul 26 11:11:57 2007 -0700
arm unaligned.h annotations Have put_unaligned() warn if types would be wrong for assignment, slap force-casts where needed. Cast the result of get_unaligned to typeof(*ptr). With that in place we get proper typechecking, both from gcc and from sparse, including that for bitwise types. Signed-off-by: Al Viro <[EMAIL PROTECTED]> Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]> --- include/asm-arm/unaligned.h | 22 ++++++++++++---------- 1 files changed, 12 insertions(+), 10 deletions(-) diff --git a/include/asm-arm/unaligned.h b/include/asm-arm/unaligned.h index 795b9e5..8431f6e 100644 --- a/include/asm-arm/unaligned.h +++ b/include/asm-arm/unaligned.h @@ -60,24 +60,24 @@ extern int __bug_unaligned_x(const void *ptr); __get_unaligned_4_be((__p+4))) #define __get_unaligned_le(ptr) \ - ({ \ + ((__force typeof(*(ptr)))({ \ const __u8 *__p = (const __u8 *)(ptr); \ __builtin_choose_expr(sizeof(*(ptr)) == 1, *__p, \ __builtin_choose_expr(sizeof(*(ptr)) == 2, __get_unaligned_2_le(__p), \ __builtin_choose_expr(sizeof(*(ptr)) == 4, __get_unaligned_4_le(__p), \ __builtin_choose_expr(sizeof(*(ptr)) == 8, __get_unaligned_8_le(__p), \ (void)__bug_unaligned_x(__p))))); \ - }) + })) #define __get_unaligned_be(ptr) \ - ({ \ + ((__force typeof(*(ptr)))({ \ const __u8 *__p = (const __u8 *)(ptr); \ __builtin_choose_expr(sizeof(*(ptr)) == 1, *__p, \ __builtin_choose_expr(sizeof(*(ptr)) == 2, __get_unaligned_2_be(__p), \ __builtin_choose_expr(sizeof(*(ptr)) == 4, __get_unaligned_4_be(__p), \ __builtin_choose_expr(sizeof(*(ptr)) == 8, __get_unaligned_8_be(__p), \ (void)__bug_unaligned_x(__p))))); \ - }) + })) static inline void __put_unaligned_2_le(__u32 __v, register __u8 *__p) @@ -131,15 +131,16 @@ static inline void __put_unaligned_8_be(const unsigned long long __v, register _ */ #define __put_unaligned_le(val,ptr) \ ({ \ + (void)sizeof(*(ptr) = (val)); \ switch (sizeof(*(ptr))) { \ case 1: \ *(ptr) = (val); \ break; \ - case 2: __put_unaligned_2_le((val),(__u8 *)(ptr)); \ + case 2: __put_unaligned_2_le((__force u16)(val),(__u8 *)(ptr)); \ break; \ - case 4: __put_unaligned_4_le((val),(__u8 *)(ptr)); \ + case 4: __put_unaligned_4_le((__force u32)(val),(__u8 *)(ptr)); \ break; \ - case 8: __put_unaligned_8_le((val),(__u8 *)(ptr)); \ + case 8: __put_unaligned_8_le((__force u64)(val),(__u8 *)(ptr)); \ break; \ default: __bug_unaligned_x(ptr); \ break; \ @@ -149,15 +150,16 @@ static inline void __put_unaligned_8_be(const unsigned long long __v, register _ #define __put_unaligned_be(val,ptr) \ ({ \ + (void)sizeof(*(ptr) = (val)); \ switch (sizeof(*(ptr))) { \ case 1: \ *(ptr) = (val); \ break; \ - case 2: __put_unaligned_2_be((val),(__u8 *)(ptr)); \ + case 2: __put_unaligned_2_be((__force u16)(val),(__u8 *)(ptr)); \ break; \ - case 4: __put_unaligned_4_be((val),(__u8 *)(ptr)); \ + case 4: __put_unaligned_4_be((__force u32)(val),(__u8 *)(ptr)); \ break; \ - case 8: __put_unaligned_8_be((val),(__u8 *)(ptr)); \ + case 8: __put_unaligned_8_be((__force u64)(val),(__u8 *)(ptr)); \ break; \ default: __bug_unaligned_x(ptr); \ break; \ - To unsubscribe from this list: send the line "unsubscribe git-commits-head" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html