Patchwork Avoid compiler error

login
register
mail settings
Submitter Stefan Weil
Date April 10, 2010, 7:26 a.m.
Message ID <1270884363-5186-1-git-send-email-weil@mail.berlios.de>
Download mbox | patch
Permalink /patch/49902/
State New
Headers show

Comments

Stefan Weil - April 10, 2010, 7:26 a.m.
A 32 bit cross compilation of x86_64-linux-user raises this error:

  CC    x86_64-linux-user/exec.o
cc1: warnings being treated as errors
exec.c: In function ‘page_init’:
exec.c:350: error: large integer implicitly truncated to unsigned type

L1_MAP_ADDR_SPACE_BITS == 47, HOST_LONG_BITS == 32,
so the shift operation indeed is problematic.

Limit endaddr to ULONG_MAX in this case.

Cc: Richard Henderson <rth@twiddle.net>
Cc: Aurelien Jarno <aurelien@aurel32.net>
Cc: Juergen Lock <nox@jelal.kn-bremen.de>
Signed-off-by: Stefan Weil <weil@mail.berlios.de>
---
 exec.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)
Aurelien Jarno - April 10, 2010, 3:15 p.m.
On Sat, Apr 10, 2010 at 09:26:03AM +0200, Stefan Weil wrote:
> A 32 bit cross compilation of x86_64-linux-user raises this error:
> 
>   CC    x86_64-linux-user/exec.o
> cc1: warnings being treated as errors
> exec.c: In function ‘page_init’:
> exec.c:350: error: large integer implicitly truncated to unsigned type
> 
> L1_MAP_ADDR_SPACE_BITS == 47, HOST_LONG_BITS == 32,
> so the shift operation indeed is problematic.
> 

I am not sure it is the real fix. I don't think there is a point of
having L1_MAP_ADDR_SPACE_BITS > HOST_LONG_BITS, most probably it should
be reduced to HOST_LONG_BITS if the latter is smaller, as done in system
mode.
Richard Henderson - April 10, 2010, 6:43 p.m.
On 04/10/2010 12:26 AM, Stefan Weil wrote:
> A 32 bit cross compilation of x86_64-linux-user raises this error:
>                       } else {
>   #if TARGET_ABI_BITS<= L1_MAP_ADDR_SPACE_BITS
>                           endaddr = ~0ul;
> +#elif HOST_LONG_BITS<= L1_MAP_ADDR_SPACE_BITS
> +                        endaddr = ULONG_MAX;
>   #else
>                           endaddr = ((abi_ulong)1<<  L1_MAP_ADDR_SPACE_BITS) - 1;
>   #endif

You ought to merge those two ifs.  I.e.


#if TARGET_ABI_BITS <= L1_MAP_ADDR_SPACE_BITS \
     || HOST_LONG_BITS<= L1_MAP_ADDR_SPACE_BITS


r~

Patch

diff --git a/exec.c b/exec.c
index a6d3bad..c80b7f7 100644
--- a/exec.c
+++ b/exec.c
@@ -343,6 +343,8 @@  static void page_init(void)
                     } else {
 #if TARGET_ABI_BITS <= L1_MAP_ADDR_SPACE_BITS
                         endaddr = ~0ul;
+#elif HOST_LONG_BITS <= L1_MAP_ADDR_SPACE_BITS
+                        endaddr = ULONG_MAX;
 #else
                         endaddr = ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS) - 1;
 #endif