Commit 623e265c6b1ad09fccecaa53f8c8a1fd572c54c7

Authored by pbrook
1 parent b2a5160c

Simplify TCG relocation bugfix.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3974 c046a42c-6fe2-441c-8c8c-71466251a162
tcg/i386/tcg-target.c
@@ -318,7 +318,7 @@ static void tcg_out_jxx(TCGContext *s, int opc, int label_index) @@ -318,7 +318,7 @@ static void tcg_out_jxx(TCGContext *s, int opc, int label_index)
318 tcg_out8(s, 0x80 + opc); 318 tcg_out8(s, 0x80 + opc);
319 } 319 }
320 tcg_out_reloc(s, s->code_ptr, R_386_PC32, label_index, -4); 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
tcg/tcg.c
@@ -97,9 +97,9 @@ void tcg_out_reloc(TCGContext *s, uint8_t *code_ptr, int type, @@ -97,9 +97,9 @@ void tcg_out_reloc(TCGContext *s, uint8_t *code_ptr, int type,
97 97
98 l = &s->labels[label_index]; 98 l = &s->labels[label_index];
99 if (l->has_value) { 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 patch_reloc(code_ptr, type, l->u.value + addend); 103 patch_reloc(code_ptr, type, l->u.value + addend);
104 } else { 104 } else {
105 /* add a new relocation entry */ 105 /* add a new relocation entry */
@@ -1810,16 +1810,11 @@ int dyngen_code(TCGContext *s, uint8_t *gen_code_buf) @@ -1810,16 +1810,11 @@ int dyngen_code(TCGContext *s, uint8_t *gen_code_buf)
1810 return s->code_ptr - gen_code_buf; 1810 return s->code_ptr - gen_code_buf;
1811 } 1811 }
1812 1812
1813 -static uint8_t *dummy_code_buf;  
1814 -  
1815 /* Return the index of the micro operation such as the pc after is < 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 }
tcg/tcg.h
@@ -257,7 +257,7 @@ void tcg_context_init(TCGContext *s); @@ -257,7 +257,7 @@ void tcg_context_init(TCGContext *s);
257 void tcg_func_start(TCGContext *s); 257 void tcg_func_start(TCGContext *s);
258 258
259 int dyngen_code(TCGContext *s, uint8_t *gen_code_buf); 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 void tcg_set_frame(TCGContext *s, int reg, 262 void tcg_set_frame(TCGContext *s, int reg,
263 tcg_target_long start, tcg_target_long size); 263 tcg_target_long start, tcg_target_long size);
tcg/x86_64/tcg-target.c
@@ -431,7 +431,7 @@ static void tcg_out_jxx(TCGContext *s, int opc, int label_index) @@ -431,7 +431,7 @@ static void tcg_out_jxx(TCGContext *s, int opc, int label_index)
431 tcg_out8(s, 0x80 + opc); 431 tcg_out8(s, 0x80 + opc);
432 } 432 }
433 tcg_out_reloc(s, s->code_ptr, R_386_PC32, label_index, -4); 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
translate-all.c
@@ -187,7 +187,7 @@ int cpu_restore_state(TranslationBlock *tb, @@ -187,7 +187,7 @@ int cpu_restore_state(TranslationBlock *tb,
187 s->tb_jmp_offset = NULL; 187 s->tb_jmp_offset = NULL;
188 s->tb_next = tb->tb_next; 188 s->tb_next = tb->tb_next;
189 #endif 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 if (j < 0) 191 if (j < 0)
192 return -1; 192 return -1;
193 /* now find start of instruction before */ 193 /* now find start of instruction before */