Revision 623e265c
b/tcg/i386/tcg-target.c | ||
---|---|---|
318 | 318 |
tcg_out8(s, 0x80 + opc); |
319 | 319 |
} |
320 | 320 |
tcg_out_reloc(s, s->code_ptr, R_386_PC32, label_index, -4); |
321 |
tcg_out32(s, -4);
|
|
321 |
s->code_ptr += 4;
|
|
322 | 322 |
} |
323 | 323 |
} |
324 | 324 |
|
b/tcg/tcg.c | ||
---|---|---|
97 | 97 |
|
98 | 98 |
l = &s->labels[label_index]; |
99 | 99 |
if (l->has_value) { |
100 |
/* FIXME: This is wrong. We can not resolve the relocation
|
|
101 |
immediately because the caller has not yet written the
|
|
102 |
initial value. */ |
|
100 |
/* FIXME: This may break relocations on RISC targets that
|
|
101 |
modify instruction fields in place. The caller may not have
|
|
102 |
written the initial value. */
|
|
103 | 103 |
patch_reloc(code_ptr, type, l->u.value + addend); |
104 | 104 |
} else { |
105 | 105 |
/* add a new relocation entry */ |
... | ... | |
1810 | 1810 |
return s->code_ptr - gen_code_buf; |
1811 | 1811 |
} |
1812 | 1812 |
|
1813 |
static uint8_t *dummy_code_buf; |
|
1814 |
|
|
1815 | 1813 |
/* Return the index of the micro operation such as the pc after is < |
1816 |
offset bytes from the start of the TB. |
|
1817 |
We have to use a dummy code buffer here to avoid clobbering the |
|
1818 |
oringinal code. Because we terminate code generation part way through |
|
1819 |
we can end up with unresolved relocations. Return -1 if not found. */ |
|
1820 |
int dyngen_code_search_pc(TCGContext *s, long offset) |
|
1814 |
offset bytes from the start of the TB. The contents of gen_code_buf must |
|
1815 |
not be changed, though writing the same values is ok. |
|
1816 |
Return -1 if not found. */ |
|
1817 |
int dyngen_code_search_pc(TCGContext *s, uint8_t *gen_code_buf, long offset) |
|
1821 | 1818 |
{ |
1822 |
if (!dummy_code_buf) |
|
1823 |
dummy_code_buf = qemu_malloc(code_gen_max_block_size()); |
|
1824 |
return tcg_gen_code_common(s, dummy_code_buf, offset); |
|
1819 |
return tcg_gen_code_common(s, gen_code_buf, offset); |
|
1825 | 1820 |
} |
b/tcg/tcg.h | ||
---|---|---|
257 | 257 |
void tcg_func_start(TCGContext *s); |
258 | 258 |
|
259 | 259 |
int dyngen_code(TCGContext *s, uint8_t *gen_code_buf); |
260 |
int dyngen_code_search_pc(TCGContext *s, long offset); |
|
260 |
int dyngen_code_search_pc(TCGContext *s, uint8_t *gen_code_buf, long offset);
|
|
261 | 261 |
|
262 | 262 |
void tcg_set_frame(TCGContext *s, int reg, |
263 | 263 |
tcg_target_long start, tcg_target_long size); |
b/tcg/x86_64/tcg-target.c | ||
---|---|---|
431 | 431 |
tcg_out8(s, 0x80 + opc); |
432 | 432 |
} |
433 | 433 |
tcg_out_reloc(s, s->code_ptr, R_386_PC32, label_index, -4); |
434 |
tcg_out32(s, -4);
|
|
434 |
s->code_ptr += 4;
|
|
435 | 435 |
} |
436 | 436 |
} |
437 | 437 |
|
b/translate-all.c | ||
---|---|---|
187 | 187 |
s->tb_jmp_offset = NULL; |
188 | 188 |
s->tb_next = tb->tb_next; |
189 | 189 |
#endif |
190 |
j = dyngen_code_search_pc(s, searched_pc - tc_ptr); |
|
190 |
j = dyngen_code_search_pc(s, (uint8_t *)tc_ptr, searched_pc - tc_ptr);
|
|
191 | 191 |
if (j < 0) |
192 | 192 |
return -1; |
193 | 193 |
/* now find start of instruction before */ |
Also available in: Unified diff