uint32_t: tcg_gen_st_i32, \
int32_t: tcg_gen_st_i32) \
(arg, tcg_env, TCG_ENV_OFS_(f))
#define tcg_gen_st_env_i64(arg, f) \
_Generic(TCG_ENV_FIELD_(f), \
uint64_t: tcg_gen_st_i64, \
int64_t: tcg_gen_st_i64) \
(arg, tcg_env, TCG_ENV_OFS_(f))
#if TARGET_LONG_BITS == 32
# define tcg_gen_ld_env_tl tcg_gen_ld_env_i32
# define tcg_gen_st_env_tl tcg_gen_st_env_i32
#else
# define tcg_gen_ld_env_tl tcg_gen_ld_env_i64
# define tcg_gen_st_env_tl tcg_gen_st_env_i64
#endif
I added that to "tcg/tcg-op-env.h".
Then replacing (a cheap replacement that can be done with coccinelle
spatch):
-- >8 --
@@
expression R;
identifier F;
symbol tcg_env;
type T;
@@
(
- tcg_gen_ld_tl(R, tcg_env, offsetof(T, F))
+ tcg_gen_ld_env_tl(R, F)
|
- tcg_gen_st_tl(R, tcg_env, offsetof(T, F))
+ tcg_gen_st_env_tl(R, F)
)
@@
expression R;
identifier F;
symbol tcg_env;
identifier T;
@@
(
- tcg_gen_ld_tl(R, tcg_env, offsetof(T, F))
+ tcg_gen_ld_env_tl(R, F)
|
- tcg_gen_st_tl(R, tcg_env, offsetof(T, F))
+ tcg_gen_st_env_tl(R, F)
)
---
Converting i386:
-- >8 --
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
index dd417cb5341..abdf9b61ad1 100644
--- a/target/i386/tcg/translate.c
+++ b/target/i386/tcg/translate.c
@@ -25,2 +25,3 @@
#include "tcg/tcg-op.h"
+#include "tcg/tcg-op-env.h"
#include "tcg/tcg-op-gvec.h"
@@ -706,5 +707,5 @@ static void gen_set_eflags(DisasContext *s,
target_ulong mask)
- tcg_gen_ld_tl(t, tcg_env, offsetof(CPUX86State, eflags));
+ tcg_gen_ld_env_tl(t, eflags);
tcg_gen_ori_tl(t, t, mask);
- tcg_gen_st_tl(t, tcg_env, offsetof(CPUX86State, eflags));
+ tcg_gen_st_env_tl(t, eflags);
}
@@ -715,5 +716,5 @@ static void gen_reset_eflags(DisasContext *s,
target_ulong mask)
- tcg_gen_ld_tl(t, tcg_env, offsetof(CPUX86State, eflags));
+ tcg_gen_ld_env_tl(t, eflags);
tcg_gen_andi_tl(t, t, ~mask);
- tcg_gen_st_tl(t, tcg_env, offsetof(CPUX86State, eflags));
+ tcg_gen_st_env_tl(t, eflags);
}
@@ -2447,4 +2448,3 @@ static void gen_x87(DisasContext *s,
X86DecodedInsn *decode)
offsetof(CPUX86State, fpds));
- tcg_gen_st_tl(last_addr, tcg_env,
- offsetof(CPUX86State, fpdp));
+ tcg_gen_st_env_tl(last_addr, fpdp);
}
@@ -2756,4 +2756,3 @@ static void gen_x87(DisasContext *s,
X86DecodedInsn *decode)
offsetof(CPUX86State, fpcs));
- tcg_gen_st_tl(eip_cur_tl(s),
- tcg_env, offsetof(CPUX86State, fpip));
+ tcg_gen_st_env_tl(eip_cur_tl(s), fpip);
}
@@ -3200,6 +3199,4 @@ static void gen_multi0F(DisasContext *s,
X86DecodedInsn *decode)
tcg_gen_mov_tl(s->T0, cpu_seg_base[R_GS]);
- tcg_gen_ld_tl(cpu_seg_base[R_GS], tcg_env,
- offsetof(CPUX86State, kernelgsbase));
- tcg_gen_st_tl(s->T0, tcg_env,
- offsetof(CPUX86State, kernelgsbase));
+ tcg_gen_ld_env_tl(cpu_seg_base[R_GS], kernelgsbase);
+ tcg_gen_st_env_tl(s->T0, kernelgsbase);
}
---
triggers:
../target/i386/tcg/translate.c:2449:13: error: controlling expression
type 'uint64_t' (aka 'unsigned long long') not compatible with any
generic association type
2449 | tcg_gen_st_env_tl(last_addr, fpdp);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/philmd/worktree/qemu/excp/include/tcg/tcg-op-env.h:65:29: note:
expanded from macro 'tcg_gen_st_env_tl'
65 | # define tcg_gen_st_env_tl tcg_gen_st_env_i32
| ^
/Users/philmd/worktree/qemu/excp/include/tcg/tcg-op-env.h:47:14: note:
expanded from macro 'tcg_gen_st_env_i32'
47 | _Generic(TCG_ENV_FIELD_(f), \
| ^~~~~~~~~~~~~~~~~
/Users/philmd/worktree/qemu/excp/include/tcg/tcg-op-env.h:16:29: note:
expanded from macro 'TCG_ENV_FIELD_'
16 | #define TCG_ENV_FIELD_(f) (((CPUArchState *)0)->f)
| ^~~~~~~~~~~~~~~~~~~~~~~~
../target/i386/tcg/translate.c:2757:9: error: controlling expression
type 'uint64_t' (aka 'unsigned long long') not compatible with any
generic association type
2757 | tcg_gen_st_env_tl(eip_cur_tl(s), fpip);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/philmd/worktree/qemu/excp/include/tcg/tcg-op-env.h:65:29: note:
expanded from macro 'tcg_gen_st_env_tl'
65 | # define tcg_gen_st_env_tl tcg_gen_st_env_i32
| ^
/Users/philmd/worktree/qemu/excp/include/tcg/tcg-op-env.h:47:14: note:
expanded from macro 'tcg_gen_st_env_i32'
47 | _Generic(TCG_ENV_FIELD_(f), \
| ^~~~~~~~~~~~~~~~~
/Users/philmd/worktree/qemu/excp/include/tcg/tcg-op-env.h:16:29: note:
expanded from macro 'TCG_ENV_FIELD_'
16 | #define TCG_ENV_FIELD_(f) (((CPUArchState *)0)->f)
| ^~~~~~~~~~~~~~~~~~~~~~~~
2 errors generated.
Both CPUX86State::fpip/fpdp fields are uint64_t, so the same class of
bug on big-endian hosts.
FAILED: [code=1] libqemu-i386-softmmu.a.p/target_i386_tcg_translate.c.o