tcg: Return success from patch_reloc

This will move the assert for success from within (subroutines of)
patch_reloc into the callers.  It will also let new code do something
different when a relocation is out of range.

For the moment, all backends are trivially converted to return true.

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2018-11-30 11:52:48 -08:00
parent 8c1b079279
commit 6ac1778676
9 changed files with 21 additions and 11 deletions

View File

@ -94,7 +94,7 @@ static inline void reloc_pc19(tcg_insn_unit *code_ptr, tcg_insn_unit *target)
*code_ptr = deposit32(*code_ptr, 5, 19, offset); *code_ptr = deposit32(*code_ptr, 5, 19, offset);
} }
static inline void patch_reloc(tcg_insn_unit *code_ptr, int type, static inline bool patch_reloc(tcg_insn_unit *code_ptr, int type,
intptr_t value, intptr_t addend) intptr_t value, intptr_t addend)
{ {
tcg_debug_assert(addend == 0); tcg_debug_assert(addend == 0);
@ -109,6 +109,7 @@ static inline void patch_reloc(tcg_insn_unit *code_ptr, int type,
default: default:
tcg_abort(); tcg_abort();
} }
return true;
} }
#define TCG_CT_CONST_AIMM 0x100 #define TCG_CT_CONST_AIMM 0x100

View File

@ -193,7 +193,7 @@ static inline void reloc_pc24(tcg_insn_unit *code_ptr, tcg_insn_unit *target)
*code_ptr = (*code_ptr & ~0xffffff) | (offset & 0xffffff); *code_ptr = (*code_ptr & ~0xffffff) | (offset & 0xffffff);
} }
static void patch_reloc(tcg_insn_unit *code_ptr, int type, static bool patch_reloc(tcg_insn_unit *code_ptr, int type,
intptr_t value, intptr_t addend) intptr_t value, intptr_t addend)
{ {
tcg_debug_assert(addend == 0); tcg_debug_assert(addend == 0);
@ -229,6 +229,7 @@ static void patch_reloc(tcg_insn_unit *code_ptr, int type,
} else { } else {
g_assert_not_reached(); g_assert_not_reached();
} }
return true;
} }
#define TCG_CT_CONST_ARM 0x100 #define TCG_CT_CONST_ARM 0x100

View File

@ -167,7 +167,7 @@ static bool have_lzcnt;
static tcg_insn_unit *tb_ret_addr; static tcg_insn_unit *tb_ret_addr;
static void patch_reloc(tcg_insn_unit *code_ptr, int type, static bool patch_reloc(tcg_insn_unit *code_ptr, int type,
intptr_t value, intptr_t addend) intptr_t value, intptr_t addend)
{ {
value += addend; value += addend;
@ -191,6 +191,7 @@ static void patch_reloc(tcg_insn_unit *code_ptr, int type,
default: default:
tcg_abort(); tcg_abort();
} }
return true;
} }
#if TCG_TARGET_REG_BITS == 64 #if TCG_TARGET_REG_BITS == 64

View File

@ -168,12 +168,13 @@ static inline void reloc_26(tcg_insn_unit *pc, tcg_insn_unit *target)
*pc = deposit32(*pc, 0, 26, reloc_26_val(pc, target)); *pc = deposit32(*pc, 0, 26, reloc_26_val(pc, target));
} }
static void patch_reloc(tcg_insn_unit *code_ptr, int type, static bool patch_reloc(tcg_insn_unit *code_ptr, int type,
intptr_t value, intptr_t addend) intptr_t value, intptr_t addend)
{ {
tcg_debug_assert(type == R_MIPS_PC16); tcg_debug_assert(type == R_MIPS_PC16);
tcg_debug_assert(addend == 0); tcg_debug_assert(addend == 0);
reloc_pc16(code_ptr, (tcg_insn_unit *)value); reloc_pc16(code_ptr, (tcg_insn_unit *)value);
return true;
} }
#define TCG_CT_CONST_ZERO 0x100 #define TCG_CT_CONST_ZERO 0x100

View File

@ -513,7 +513,7 @@ static const uint32_t tcg_to_isel[] = {
[TCG_COND_GTU] = ISEL | BC_(7, CR_GT), [TCG_COND_GTU] = ISEL | BC_(7, CR_GT),
}; };
static void patch_reloc(tcg_insn_unit *code_ptr, int type, static bool patch_reloc(tcg_insn_unit *code_ptr, int type,
intptr_t value, intptr_t addend) intptr_t value, intptr_t addend)
{ {
tcg_insn_unit *target; tcg_insn_unit *target;
@ -548,6 +548,7 @@ static void patch_reloc(tcg_insn_unit *code_ptr, int type,
default: default:
g_assert_not_reached(); g_assert_not_reached();
} }
return true;
} }
static void tcg_out_mem_long(TCGContext *s, int opi, int opx, TCGReg rt, static void tcg_out_mem_long(TCGContext *s, int opi, int opx, TCGReg rt,

View File

@ -366,7 +366,7 @@ static void * const qemu_st_helpers[16] = {
static tcg_insn_unit *tb_ret_addr; static tcg_insn_unit *tb_ret_addr;
uint64_t s390_facilities; uint64_t s390_facilities;
static void patch_reloc(tcg_insn_unit *code_ptr, int type, static bool patch_reloc(tcg_insn_unit *code_ptr, int type,
intptr_t value, intptr_t addend) intptr_t value, intptr_t addend)
{ {
intptr_t pcrel2; intptr_t pcrel2;
@ -393,6 +393,7 @@ static void patch_reloc(tcg_insn_unit *code_ptr, int type,
default: default:
g_assert_not_reached(); g_assert_not_reached();
} }
return true;
} }
/* parse target specific constraints */ /* parse target specific constraints */

View File

@ -291,7 +291,7 @@ static inline int check_fit_i32(int32_t val, unsigned int bits)
# define check_fit_ptr check_fit_i32 # define check_fit_ptr check_fit_i32
#endif #endif
static void patch_reloc(tcg_insn_unit *code_ptr, int type, static bool patch_reloc(tcg_insn_unit *code_ptr, int type,
intptr_t value, intptr_t addend) intptr_t value, intptr_t addend)
{ {
uint32_t insn = *code_ptr; uint32_t insn = *code_ptr;
@ -316,6 +316,7 @@ static void patch_reloc(tcg_insn_unit *code_ptr, int type,
} }
*code_ptr = insn; *code_ptr = insn;
return true;
} }
/* parse target specific constraints */ /* parse target specific constraints */

View File

@ -66,7 +66,7 @@
static void tcg_target_init(TCGContext *s); static void tcg_target_init(TCGContext *s);
static const TCGTargetOpDef *tcg_target_op_def(TCGOpcode); static const TCGTargetOpDef *tcg_target_op_def(TCGOpcode);
static void tcg_target_qemu_prologue(TCGContext *s); static void tcg_target_qemu_prologue(TCGContext *s);
static void patch_reloc(tcg_insn_unit *code_ptr, int type, static bool patch_reloc(tcg_insn_unit *code_ptr, int type,
intptr_t value, intptr_t addend); intptr_t value, intptr_t addend);
/* The CIE and FDE header definitions will be common to all hosts. */ /* The CIE and FDE header definitions will be common to all hosts. */
@ -268,7 +268,8 @@ static void tcg_out_reloc(TCGContext *s, tcg_insn_unit *code_ptr, int type,
/* FIXME: This may break relocations on RISC targets that /* FIXME: This may break relocations on RISC targets that
modify instruction fields in place. The caller may not have modify instruction fields in place. The caller may not have
written the initial value. */ written the initial value. */
patch_reloc(code_ptr, type, l->u.value, addend); bool ok = patch_reloc(code_ptr, type, l->u.value, addend);
tcg_debug_assert(ok);
} else { } else {
/* add a new relocation entry */ /* add a new relocation entry */
r = tcg_malloc(sizeof(TCGRelocation)); r = tcg_malloc(sizeof(TCGRelocation));
@ -288,7 +289,8 @@ static void tcg_out_label(TCGContext *s, TCGLabel *l, tcg_insn_unit *ptr)
tcg_debug_assert(!l->has_value); tcg_debug_assert(!l->has_value);
for (r = l->u.first_reloc; r != NULL; r = r->next) { for (r = l->u.first_reloc; r != NULL; r = r->next) {
patch_reloc(r->ptr, r->type, value, r->addend); bool ok = patch_reloc(r->ptr, r->type, value, r->addend);
tcg_debug_assert(ok);
} }
l->has_value = 1; l->has_value = 1;

View File

@ -369,7 +369,7 @@ static const char *const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
}; };
#endif #endif
static void patch_reloc(tcg_insn_unit *code_ptr, int type, static bool patch_reloc(tcg_insn_unit *code_ptr, int type,
intptr_t value, intptr_t addend) intptr_t value, intptr_t addend)
{ {
/* tcg_out_reloc always uses the same type, addend. */ /* tcg_out_reloc always uses the same type, addend. */
@ -381,6 +381,7 @@ static void patch_reloc(tcg_insn_unit *code_ptr, int type,
} else { } else {
tcg_patch64(code_ptr, value); tcg_patch64(code_ptr, value);
} }
return true;
} }
/* Parse target specific constraints. */ /* Parse target specific constraints. */