qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] alpha: Fix build error for linux-user


From: Pranith Kumar
Subject: Re: [Qemu-devel] [PATCH] alpha: Fix build error for linux-user
Date: Fri, 17 Jun 2016 13:20:36 -0400

On Thu, Jun 16, 2016 at 8:43 PM, Laurent Vivier <address@hidden> wrote:
>
>
> Le 16/06/2016 à 21:15, Pranith Kumar a écrit :
>> On Thu, Jun 16, 2016 at 3:07 PM, Richard Henderson <address@hidden> wrote:
>>> On 06/16/2016 11:56 AM, Pranith Kumar wrote:
>>>> Using gcc 6.1 for alpha-linux-user target we see the following build
>>>> error:
>>>>
>>>> /mnt/devops/code/qemu/target-alpha/translate.c: In function ‘in_superpage’:
>>>> /mnt/devops/code/qemu/target-alpha/translate.c:454:52: error: 
>>>> self-comparison always evaluates to true [-Werror=tautological-compare]
>>>>              && addr >> TARGET_VIRT_ADDR_SPACE_BITS == addr >> 63);
>>>>
>>>> Fix it by replacing (addr >> 63) by '1' which is what it evaluates to
>>>> since addr is negative.
>>>>
>>>> Signed-off-by: Pranith Kumar <address@hidden>
>>>> ---
>>>>  target-alpha/translate.c | 2 +-
>>>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/target-alpha/translate.c b/target-alpha/translate.c
>>>> index f9b2426..31da6ea 100644
>>>> --- a/target-alpha/translate.c
>>>> +++ b/target-alpha/translate.c
>>>> @@ -451,7 +451,7 @@ static bool in_superpage(DisasContext *ctx, int64_t 
>>>> addr)
>>>>      return ((ctx->tb->flags & TB_FLAGS_USER_MODE) == 0
>>>>              && addr < 0
>>>>              && ((addr >> 41) & 3) == 2
>>>> -            && addr >> TARGET_VIRT_ADDR_SPACE_BITS == addr >> 63);
>>>> +            && addr >> TARGET_VIRT_ADDR_SPACE_BITS == 1);
>>>>  }
>>>
>>> This fix is incorrect.
>>>
>>>   (1) addr is not always negative.
>>>   (2) in_superpage is only relevant for alpha-softmmu, where
>>>       TARGET_VIRT_ADDR_SPACE_BITS is not 63.
>>
>> If you see line 2 of the condition you check for (addr < 0). Only if
>> this evaluates to true do you check the right shift value of addr.
>>
>> Reg. (2), I think that is what gcc is erroring out for.
>> TARGET_VIRT_ADDR_SPACE_BITS is 63 for linux-user and we are comparing
>> (addr >> 63) with itself. GCC rightly says that it is a tautological
>> compare and errors out. May be we can have a better work around.
>
> Perhaps something like:
>
> #ifndef CONFIG_USER_ONLY
> static bool in_superpage(DisasContext *ctx, int64_t addr)
> {
> ...
> }
> #endif
> ...
>
> #ifdef CONFIG_USER_ONLY
>     pc_mask = ~TARGET_PAGE_MASK;
> #else
>     if (in_superpage(&ctx, pc_start)) {
>         pc_mask = (1ULL << 41) - 1;
>     } else {
>        pc_mask = ~TARGET_PAGE_MASK;
>     }
> #endif
>

OK, I will use this.

Thanks!
-- 
Pranith



reply via email to

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