mirror of https://github.com/xemu-project/xemu.git
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
|
These are usually used to access struct data members once the struct has
|
||||||
been locked - usually with lock_user_struct. */
|
been locked - usually with lock_user_struct. */
|
||||||
|
|
||||||
/* Tricky points:
|
/*
|
||||||
- Use __builtin_choose_expr to avoid type promotion from ?:,
|
* Tricky points:
|
||||||
- Invalid sizes result in a compile time error stemming from
|
* - Use __builtin_choose_expr to avoid type promotion from ?:,
|
||||||
the fact that abort has no parameters.
|
* - Invalid sizes result in a compile time error stemming from
|
||||||
- It's easier to use the endian-specific unaligned load/store
|
* the fact that abort has no parameters.
|
||||||
functions than host-endian unaligned load/store plus tswapN. */
|
* - 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) \
|
#define PRAGMA_REENABLE_PACKED_WARNING \
|
||||||
(__builtin_choose_expr(sizeof(*(hptr)) == 1, stb_p, \
|
_Pragma("GCC diagnostic pop")
|
||||||
__builtin_choose_expr(sizeof(*(hptr)) == 2, stw_##e##_p, \
|
|
||||||
__builtin_choose_expr(sizeof(*(hptr)) == 4, stl_##e##_p, \
|
#else
|
||||||
__builtin_choose_expr(sizeof(*(hptr)) == 8, stq_##e##_p, abort)))) \
|
#define PRAGMA_DISABLE_PACKED_WARNING
|
||||||
((hptr), (x)), (void)0)
|
#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
|
#ifdef TARGET_WORDS_BIGENDIAN
|
||||||
# define __put_user(x, hptr) __put_user_e(x, hptr, be)
|
# 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]);
|
__put_user(val32, &sf->insns[1]);
|
||||||
if (err)
|
if (err)
|
||||||
goto sigsegv;
|
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));
|
unlock_user(sf, sf_addr, sizeof(struct target_signal_frame));
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in New Issue