qemu/atomic: Add aligned_{int64,uint64}_t types
Use it to avoid some clang-12 -Watomic-alignment errors, forcing some structures to be aligned and as a pointer when we have ensured that the address is aligned. Tested-by: Cole Robinson <crobinso@redhat.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
47345e7124
commit
9ef0c6d6a7
@ -28,8 +28,8 @@
|
||||
# define SHIFT 4
|
||||
#elif DATA_SIZE == 8
|
||||
# define SUFFIX q
|
||||
# define DATA_TYPE uint64_t
|
||||
# define SDATA_TYPE int64_t
|
||||
# define DATA_TYPE aligned_uint64_t
|
||||
# define SDATA_TYPE aligned_int64_t
|
||||
# define BSWAP bswap64
|
||||
# define SHIFT 3
|
||||
#elif DATA_SIZE == 4
|
||||
|
@ -271,7 +271,19 @@
|
||||
_oldn; \
|
||||
})
|
||||
|
||||
/* Abstractions to access atomically (i.e. "once") i64/u64 variables */
|
||||
/*
|
||||
* Abstractions to access atomically (i.e. "once") i64/u64 variables.
|
||||
*
|
||||
* The i386 abi is odd in that by default members are only aligned to
|
||||
* 4 bytes, which means that 8-byte types can wind up mis-aligned.
|
||||
* Clang will then warn about this, and emit a call into libatomic.
|
||||
*
|
||||
* Use of these types in structures when they will be used with atomic
|
||||
* operations can avoid this.
|
||||
*/
|
||||
typedef int64_t aligned_int64_t __attribute__((aligned(8)));
|
||||
typedef uint64_t aligned_uint64_t __attribute__((aligned(8)));
|
||||
|
||||
#ifdef CONFIG_ATOMIC64
|
||||
/* Use __nocheck because sizeof(void *) might be < sizeof(u64) */
|
||||
#define qatomic_read_i64(P) \
|
||||
|
@ -21,7 +21,7 @@
|
||||
|
||||
typedef struct Stat64 {
|
||||
#ifdef CONFIG_ATOMIC64
|
||||
uint64_t value;
|
||||
aligned_uint64_t value;
|
||||
#else
|
||||
uint32_t low, high;
|
||||
uint32_t lock;
|
||||
|
@ -82,7 +82,7 @@ static abi_ulong hppa_lws(CPUHPPAState *env)
|
||||
o64 = *(uint64_t *)g2h(cs, old);
|
||||
n64 = *(uint64_t *)g2h(cs, new);
|
||||
#ifdef CONFIG_ATOMIC64
|
||||
r64 = qatomic_cmpxchg__nocheck((uint64_t *)g2h(cs, addr),
|
||||
r64 = qatomic_cmpxchg__nocheck((aligned_uint64_t *)g2h(cs, addr),
|
||||
o64, n64);
|
||||
ret = r64 != o64;
|
||||
#else
|
||||
|
@ -47,7 +47,7 @@ typedef struct TimersState {
|
||||
int64_t last_delta;
|
||||
|
||||
/* Compensate for varying guest execution speed. */
|
||||
int64_t qemu_icount_bias;
|
||||
aligned_int64_t qemu_icount_bias;
|
||||
|
||||
int64_t vm_clock_warp_start;
|
||||
int64_t cpu_clock_offset;
|
||||
|
@ -83,8 +83,8 @@ typedef struct QSPCallSite QSPCallSite;
|
||||
struct QSPEntry {
|
||||
void *thread_ptr;
|
||||
const QSPCallSite *callsite;
|
||||
uint64_t n_acqs;
|
||||
uint64_t ns;
|
||||
aligned_uint64_t n_acqs;
|
||||
aligned_uint64_t ns;
|
||||
unsigned int n_objs; /* count of coalesced objs; only used for reporting */
|
||||
};
|
||||
typedef struct QSPEntry QSPEntry;
|
||||
|
Loading…
Reference in New Issue
Block a user