On Saturday 30 April 2005 12:10, David Woodhouse wrote: > GCC 4 occasionally generates functions with the 'blr' somewhere in the > middle and a branch at the end. > > --- qemu-0.7.0/dyngen.c.orig 2005-04-30 11:59:05.000000000 +0100 > +++ qemu-0.7.0/dyngen.c 2005-04-30 12:00:11.000000000 +0100 > @@ -1396,11 +1395,13 @@ void gen_code(const char *name, host_ulo > #elif defined(HOST_PPC) > { > uint8_t *p; > + uint32_t insn; > p = (void *)(p_end - 4); > if (p == p_start) > error("empty code for %s", name); > - if (get32((uint32_t *)p) != 0x4e800020) > - error("blr expected at the end of %s", name); > + insn = get32((uint32_t *)p); > + if (insn != 0x4e800020 && (insn & 0xfc000002) != 0x48000000) > + error("blr or b expected at the end of %s", name); > copy_size = p - p_start; > } > #elif defined(HOST_S390)
This is not correct. If the blr is not at the end of the function, things will break. dyngen assumes the last instruction is the only return instruction in the function. This allows it to remove the blr insn and concatenate multiple functions together. This basically only ever worked because gcc could be coerced into generating relatively simple code. GCC4 contains much more aggressive high level optimizers, so this is no longer possible. Paul _______________________________________________ Qemu-devel mailing list Qemu-devel@nongnu.org http://lists.nongnu.org/mailman/listinfo/qemu-devel