Add a workaround for clang bug and remove misleading comment (sparc)
-----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJbyNhBAAoJEPMMOL0/L748u/sQALDmpdHXmqgiA9YPYGSg6Yn5 J6TsMs9O+DcgIMmLkYcvHEajJf5R6j5hO4HRnrqefnEaAQHMtoDNxTMqTqyiRyyd rIeokVauBeDrnr88XxRGGDTfyKMp9qR255wjpaueKtRmloHN+EvgQ+a9vgZlqDoi CmpmA05wVYdW2ku3uk5QtrGsfmLsUnT9ETTs+/kU9uoVujnYe+Ix77kDb8BYe1zz OL2aBu5f5LdJKqvbIMsxHg7m32MxG4swLf3gjD6wl5R711Pin9Uidpg7mzVmmElp mUTuSSJtTbqqM15NanQbfXAoBBStM+ILH5juaHjNC5iA8Li1AL2+KVckWELNOJnd 0tbagKS8MAiHw9sExMrREArpqsusJ6YUaHMhlLdtnV+r8YKry1iK1nFS8KIdbY3r 4stL/H7dKfvtSlSA4bF0zcwZwqJMvX5qNKT8fXUV2j2/i6ttQahL/mwqClQDcuFA LkdMCcI+TXvbt04KeYE9eGbWUg2JFFlf2qiX2bD/tUqTDLjFP15YFtpY+3B0FnLW EUdooDKsjlyz562SIm9ccGlyNwKpsSVenUuU4n0tmCq8PVe3S7UyXQH+w+a7mWZZ sOOFc64gTB+8Z8wUdAm6MXCgUoKavfGUPYAIq5cbYcxEgQ8XuMunx5TtDnjC2tZ1 EwPPfdzK8LLaVYxTLkr/ =LSxi -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/vivier2/tags/linux-user-for-3.1-pull-request' into staging Add a workaround for clang bug and remove misleading comment (sparc) # gpg: Signature made Thu 18 Oct 2018 20:00:17 BST # gpg: using RSA key F30C38BD3F2FBE3C # gpg: Good signature from "Laurent Vivier <lvivier@redhat.com>" # gpg: aka "Laurent Vivier <laurent@vivier.eu>" # gpg: aka "Laurent Vivier (Red Hat) <lvivier@redhat.com>" # Primary key fingerprint: CD2F 75DD C8E3 A4DC 2E4F 5173 F30C 38BD 3F2F BE3C * remotes/vivier2/tags/linux-user-for-3.1-pull-request: linux-user/sparc/signal.c: Remove unnecessary comment linux-user: Suppress address-of-packed-member warnings in __get/put_user_e Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
1b7490446b
@ -461,27 +461,59 @@ static inline int access_ok(int type, abi_ulong addr, abi_ulong size)
|
||||
These are usually used to access struct data members once the struct has
|
||||
been locked - usually with lock_user_struct. */
|
||||
|
||||
/* Tricky points:
|
||||
- Use __builtin_choose_expr to avoid type promotion from ?:,
|
||||
- Invalid sizes result in a compile time error stemming from
|
||||
the fact that abort has no parameters.
|
||||
- It's easier to use the endian-specific unaligned load/store
|
||||
functions than host-endian unaligned load/store plus tswapN. */
|
||||
/*
|
||||
* Tricky points:
|
||||
* - Use __builtin_choose_expr to avoid type promotion from ?:,
|
||||
* - Invalid sizes result in a compile time error stemming from
|
||||
* the fact that abort has no parameters.
|
||||
* - It's easier to use the endian-specific unaligned load/store
|
||||
* functions than host-endian unaligned load/store plus tswapN.
|
||||
* - The pragmas are necessary only to silence a clang false-positive
|
||||
* warning: see https://bugs.llvm.org/show_bug.cgi?id=39113 .
|
||||
* - We have to disable -Wpragmas warnings to avoid a complaint about
|
||||
* an unknown warning type from older compilers that don't know about
|
||||
* -Waddress-of-packed-member.
|
||||
* - gcc has bugs in its _Pragma() support in some versions, eg
|
||||
* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83256 -- so we only
|
||||
* include the warning-suppression pragmas for clang
|
||||
*/
|
||||
#ifdef __clang__
|
||||
#define PRAGMA_DISABLE_PACKED_WARNING \
|
||||
_Pragma("GCC diagnostic push"); \
|
||||
_Pragma("GCC diagnostic ignored \"-Wpragmas\""); \
|
||||
_Pragma("GCC diagnostic ignored \"-Waddress-of-packed-member\"")
|
||||
|
||||
#define __put_user_e(x, hptr, e) \
|
||||
(__builtin_choose_expr(sizeof(*(hptr)) == 1, stb_p, \
|
||||
__builtin_choose_expr(sizeof(*(hptr)) == 2, stw_##e##_p, \
|
||||
__builtin_choose_expr(sizeof(*(hptr)) == 4, stl_##e##_p, \
|
||||
__builtin_choose_expr(sizeof(*(hptr)) == 8, stq_##e##_p, abort)))) \
|
||||
((hptr), (x)), (void)0)
|
||||
#define PRAGMA_REENABLE_PACKED_WARNING \
|
||||
_Pragma("GCC diagnostic pop")
|
||||
|
||||
#else
|
||||
#define PRAGMA_DISABLE_PACKED_WARNING
|
||||
#define PRAGMA_REENABLE_PACKED_WARNING
|
||||
#endif
|
||||
|
||||
#define __put_user_e(x, hptr, e) \
|
||||
do { \
|
||||
PRAGMA_DISABLE_PACKED_WARNING; \
|
||||
(__builtin_choose_expr(sizeof(*(hptr)) == 1, stb_p, \
|
||||
__builtin_choose_expr(sizeof(*(hptr)) == 2, stw_##e##_p, \
|
||||
__builtin_choose_expr(sizeof(*(hptr)) == 4, stl_##e##_p, \
|
||||
__builtin_choose_expr(sizeof(*(hptr)) == 8, stq_##e##_p, abort)))) \
|
||||
((hptr), (x)), (void)0); \
|
||||
PRAGMA_REENABLE_PACKED_WARNING; \
|
||||
} while (0)
|
||||
|
||||
#define __get_user_e(x, hptr, e) \
|
||||
do { \
|
||||
PRAGMA_DISABLE_PACKED_WARNING; \
|
||||
((x) = (typeof(*hptr))( \
|
||||
__builtin_choose_expr(sizeof(*(hptr)) == 1, ldub_p, \
|
||||
__builtin_choose_expr(sizeof(*(hptr)) == 2, lduw_##e##_p, \
|
||||
__builtin_choose_expr(sizeof(*(hptr)) == 4, ldl_##e##_p, \
|
||||
__builtin_choose_expr(sizeof(*(hptr)) == 8, ldq_##e##_p, abort)))) \
|
||||
(hptr)), (void)0); \
|
||||
PRAGMA_REENABLE_PACKED_WARNING; \
|
||||
} while (0)
|
||||
|
||||
#define __get_user_e(x, hptr, e) \
|
||||
((x) = (typeof(*hptr))( \
|
||||
__builtin_choose_expr(sizeof(*(hptr)) == 1, ldub_p, \
|
||||
__builtin_choose_expr(sizeof(*(hptr)) == 2, lduw_##e##_p, \
|
||||
__builtin_choose_expr(sizeof(*(hptr)) == 4, ldl_##e##_p, \
|
||||
__builtin_choose_expr(sizeof(*(hptr)) == 8, ldq_##e##_p, abort)))) \
|
||||
(hptr)), (void)0)
|
||||
|
||||
#ifdef TARGET_WORDS_BIGENDIAN
|
||||
# define __put_user(x, hptr) __put_user_e(x, hptr, be)
|
||||
|
@ -258,10 +258,6 @@ void setup_frame(int sig, struct target_sigaction *ka,
|
||||
__put_user(val32, &sf->insns[1]);
|
||||
if (err)
|
||||
goto sigsegv;
|
||||
|
||||
/* Flush instruction space. */
|
||||
// flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
|
||||
// tb_flush(env);
|
||||
}
|
||||
unlock_user(sf, sf_addr, sizeof(struct target_signal_frame));
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user