Simplify TCG relocation bugfix.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3974 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
b2a5160c9f
commit
623e265c6b
@ -318,7 +318,7 @@ static void tcg_out_jxx(TCGContext *s, int opc, int label_index)
|
||||
tcg_out8(s, 0x80 + opc);
|
||||
}
|
||||
tcg_out_reloc(s, s->code_ptr, R_386_PC32, label_index, -4);
|
||||
tcg_out32(s, -4);
|
||||
s->code_ptr += 4;
|
||||
}
|
||||
}
|
||||
|
||||
|
21
tcg/tcg.c
21
tcg/tcg.c
@ -97,9 +97,9 @@ void tcg_out_reloc(TCGContext *s, uint8_t *code_ptr, int type,
|
||||
|
||||
l = &s->labels[label_index];
|
||||
if (l->has_value) {
|
||||
/* FIXME: This is wrong. We can not resolve the relocation
|
||||
immediately because the caller has not yet written the
|
||||
initial value. */
|
||||
/* FIXME: This may break relocations on RISC targets that
|
||||
modify instruction fields in place. The caller may not have
|
||||
written the initial value. */
|
||||
patch_reloc(code_ptr, type, l->u.value + addend);
|
||||
} else {
|
||||
/* add a new relocation entry */
|
||||
@ -1810,16 +1810,11 @@ int dyngen_code(TCGContext *s, uint8_t *gen_code_buf)
|
||||
return s->code_ptr - gen_code_buf;
|
||||
}
|
||||
|
||||
static uint8_t *dummy_code_buf;
|
||||
|
||||
/* Return the index of the micro operation such as the pc after is <
|
||||
offset bytes from the start of the TB.
|
||||
We have to use a dummy code buffer here to avoid clobbering the
|
||||
oringinal code. Because we terminate code generation part way through
|
||||
we can end up with unresolved relocations. Return -1 if not found. */
|
||||
int dyngen_code_search_pc(TCGContext *s, long offset)
|
||||
offset bytes from the start of the TB. The contents of gen_code_buf must
|
||||
not be changed, though writing the same values is ok.
|
||||
Return -1 if not found. */
|
||||
int dyngen_code_search_pc(TCGContext *s, uint8_t *gen_code_buf, long offset)
|
||||
{
|
||||
if (!dummy_code_buf)
|
||||
dummy_code_buf = qemu_malloc(code_gen_max_block_size());
|
||||
return tcg_gen_code_common(s, dummy_code_buf, offset);
|
||||
return tcg_gen_code_common(s, gen_code_buf, offset);
|
||||
}
|
||||
|
@ -257,7 +257,7 @@ void tcg_context_init(TCGContext *s);
|
||||
void tcg_func_start(TCGContext *s);
|
||||
|
||||
int dyngen_code(TCGContext *s, uint8_t *gen_code_buf);
|
||||
int dyngen_code_search_pc(TCGContext *s, long offset);
|
||||
int dyngen_code_search_pc(TCGContext *s, uint8_t *gen_code_buf, long offset);
|
||||
|
||||
void tcg_set_frame(TCGContext *s, int reg,
|
||||
tcg_target_long start, tcg_target_long size);
|
||||
|
@ -431,7 +431,7 @@ static void tcg_out_jxx(TCGContext *s, int opc, int label_index)
|
||||
tcg_out8(s, 0x80 + opc);
|
||||
}
|
||||
tcg_out_reloc(s, s->code_ptr, R_386_PC32, label_index, -4);
|
||||
tcg_out32(s, -4);
|
||||
s->code_ptr += 4;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -187,7 +187,7 @@ int cpu_restore_state(TranslationBlock *tb,
|
||||
s->tb_jmp_offset = NULL;
|
||||
s->tb_next = tb->tb_next;
|
||||
#endif
|
||||
j = dyngen_code_search_pc(s, searched_pc - tc_ptr);
|
||||
j = dyngen_code_search_pc(s, (uint8_t *)tc_ptr, searched_pc - tc_ptr);
|
||||
if (j < 0)
|
||||
return -1;
|
||||
/* now find start of instruction before */
|
||||
|
Loading…
Reference in New Issue
Block a user