On Thu, Jun 16, 2016 at 8:43 PM, Laurent Vivier <[email protected]> wrote: > > > Le 16/06/2016 à 21:15, Pranith Kumar a écrit : >> On Thu, Jun 16, 2016 at 3:07 PM, Richard Henderson <[email protected]> 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 <[email protected]> >>>> --- >>>> 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
