mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-01-22 08:51:05 +00:00
tcg: Limit the number of ops in a TB
In 6001f7729e12 we partially attempt to address the branch displacement overflow caused by 15fa08f845. However, gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vqtbX.c is a testcase that contains a TB so large as to overflow anyway. The limit here of 8000 ops produces a maximum output TB size of 24112 bytes on a ppc64le host with that test case. This is still much less than the maximum forward branch distance of 32764 bytes. Backports commit abebf92597186be2bc48d487235da28b1127860f from qemu
This commit is contained in:
parent
33f7f6f09a
commit
f417df19b7
|
@ -504,6 +504,7 @@ void tcg_func_start(TCGContext *s)
|
|||
/* No temps have been previously allocated for size or locality. */
|
||||
memset(s->free_temps, 0, sizeof(s->free_temps));
|
||||
|
||||
s->nb_ops = 0;
|
||||
s->nb_labels = 0;
|
||||
s->current_frame_offset = s->frame_start;
|
||||
|
||||
|
@ -1677,6 +1678,7 @@ void tcg_op_remove(TCGContext *s, TCGOp *op)
|
|||
{
|
||||
QTAILQ_REMOVE(&s->ops, op, link);
|
||||
QTAILQ_INSERT_TAIL(&s->free_ops, op, link);
|
||||
s->nb_ops--;
|
||||
|
||||
#ifdef CONFIG_PROFILER
|
||||
atomic_set(&s->prof.del_op_count, s->prof.del_op_count + 1);
|
||||
|
@ -1695,6 +1697,7 @@ static TCGOp *tcg_op_alloc(TCGContext *s, TCGOpcode opc)
|
|||
}
|
||||
memset(op, 0, offsetof(TCGOp, link));
|
||||
op->opc = opc;
|
||||
s->nb_ops++;
|
||||
|
||||
return op;
|
||||
}
|
||||
|
|
|
@ -723,6 +723,7 @@ struct TCGContext {
|
|||
int nb_globals;
|
||||
int nb_temps;
|
||||
int nb_indirects;
|
||||
int nb_ops;
|
||||
|
||||
/* goto_tb support */
|
||||
tcg_insn_unit *code_buf;
|
||||
|
@ -1055,7 +1056,12 @@ static inline TCGOp *tcg_last_op(TCGContext *tcg_ctx)
|
|||
/* Test for whether to terminate the TB for using too many opcodes. */
|
||||
static inline bool tcg_op_buf_full(TCGContext *tcg_ctx)
|
||||
{
|
||||
return false;
|
||||
/* This is not a hard limit, it merely stops translation when
|
||||
* we have produced "enough" opcodes. We want to limit TB size
|
||||
* such that a RISC host can reasonably use a 16-bit signed
|
||||
* branch within the TB.
|
||||
*/
|
||||
return tcg_ctx->nb_ops >= 8000;
|
||||
}
|
||||
|
||||
TCGTemp *tcg_global_mem_new_internal(TCGContext *s, TCGType type, TCGv_ptr base,
|
||||
|
|
Loading…
Reference in a new issue