qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] Fix dyngen failure on PPC.


From: Paul Brook
Subject: Re: [Qemu-devel] [PATCH] Fix dyngen failure on PPC.
Date: Sun, 1 May 2005 18:04:42 +0100
User-agent: KMail/1.7.2

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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]