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