[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 6/6] accel/tcg: Split out setjmp_gen_code
From: |
Richard Henderson |
Subject: |
[PATCH v2 6/6] accel/tcg: Split out setjmp_gen_code |
Date: |
Mon, 7 Nov 2022 08:28:52 +1100 |
Isolate the code protected by setjmp. Fixes:
translate-all.c: In function ‘tb_gen_code’:
translate-all.c:748:51: error: argument ‘cflags’ might be clobbered by
‘longjmp’ or ‘vfork’ [-Werror=clobbered]
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
accel/tcg/translate-all.c | 58 ++++++++++++++++++++++-----------------
1 file changed, 33 insertions(+), 25 deletions(-)
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
index 9ee21f7f52..ac3ee3740c 100644
--- a/accel/tcg/translate-all.c
+++ b/accel/tcg/translate-all.c
@@ -742,6 +742,37 @@ void page_collection_unlock(struct page_collection *set)
#endif /* !CONFIG_USER_ONLY */
+/*
+ * Isolate the portion of code gen which can setjmp/longjmp.
+ * Return the size of the generated code, or negative on error.
+ */
+static int setjmp_gen_code(CPUArchState *env, TranslationBlock *tb,
+ target_ulong pc, void *host_pc,
+ int *max_insns, int64_t *ti)
+{
+ int ret = sigsetjmp(tcg_ctx->jmp_trans, 0);
+ if (unlikely(ret != 0)) {
+ return ret;
+ }
+
+ tcg_func_start(tcg_ctx);
+
+ tcg_ctx->cpu = env_cpu(env);
+ gen_intermediate_code(env_cpu(env), tb, *max_insns, pc, host_pc);
+ assert(tb->size != 0);
+ tcg_ctx->cpu = NULL;
+ *max_insns = tb->icount;
+
+#ifdef CONFIG_PROFILER
+ qatomic_set(&tcg_ctx->prof.tb_count, tcg_ctx->prof.tb_count + 1);
+ qatomic_set(&tcg_ctx->prof.interm_time,
+ tcg_ctx->prof.interm_time + profile_getclock() - *ti);
+ *ti = profile_getclock();
+#endif
+
+ return tcg_gen_code(tcg_ctx, tb, pc);
+}
+
/* Called with mmap_lock held for user mode emulation. */
TranslationBlock *tb_gen_code(CPUState *cpu,
target_ulong pc, target_ulong cs_base,
@@ -754,8 +785,8 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
int gen_code_size, search_size, max_insns;
#ifdef CONFIG_PROFILER
TCGProfile *prof = &tcg_ctx->prof;
- int64_t ti;
#endif
+ int64_t ti;
void *host_pc;
assert_memory_lock();
@@ -805,33 +836,10 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
ti = profile_getclock();
#endif
- gen_code_size = sigsetjmp(tcg_ctx->jmp_trans, 0);
- if (unlikely(gen_code_size != 0)) {
- goto error_return;
- }
-
- tcg_func_start(tcg_ctx);
-
- tcg_ctx->cpu = env_cpu(env);
- gen_intermediate_code(cpu, tb, max_insns, pc, host_pc);
- assert(tb->size != 0);
- tcg_ctx->cpu = NULL;
- max_insns = tb->icount;
-
trace_translate_block(tb, pc, tb->tc.ptr);
- /* generate machine code */
-
-#ifdef CONFIG_PROFILER
- qatomic_set(&prof->tb_count, prof->tb_count + 1);
- qatomic_set(&prof->interm_time,
- prof->interm_time + profile_getclock() - ti);
- ti = profile_getclock();
-#endif
-
- gen_code_size = tcg_gen_code(tcg_ctx, tb, pc);
+ gen_code_size = setjmp_gen_code(env, tb, pc, host_pc, &max_insns, &ti);
if (unlikely(gen_code_size < 0)) {
- error_return:
switch (gen_code_size) {
case -1:
/*
--
2.34.1
- [PATCH v2 0/6] Two -Wclobbered fixes, plus other cleanup, Richard Henderson, 2022/11/06
- [PATCH v2 1/6] disas/nanomips: Move setjmp into nanomips_dis, Richard Henderson, 2022/11/06
- [PATCH v2 2/6] disas/nanomips: Merge insn{1,2,3} into words[3], Richard Henderson, 2022/11/06
- [PATCH v2 3/6] disas/nanomips: Split out read_u16, Richard Henderson, 2022/11/06
- [PATCH v2 4/6] disas/nanomips: Tidy read for 48-bit opcodes, Richard Henderson, 2022/11/06
- [PATCH v2 5/6] tcg: Move TCG_TARGET_HAS_direct_jump init to tb_gen_code, Richard Henderson, 2022/11/06
- [PATCH v2 6/6] accel/tcg: Split out setjmp_gen_code,
Richard Henderson <=
- Re: [PATCH v2 0/6] Two -Wclobbered fixes, plus other cleanup, Philippe Mathieu-Daudé, 2022/11/07