x86_64 warning fixes
authorSimon Marlow <marlowsd@gmail.com>
Mon, 3 Aug 2009 11:59:55 +0000 (11:59 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Mon, 3 Aug 2009 11:59:55 +0000 (11:59 +0000)
rts/Adjustor.c
rts/Linker.c
rts/ghc.mk

index 0f09743..aa7a809 100644 (file)
@@ -509,6 +509,7 @@ createAdjustor(int cconv, StgStablePtr hptr,
     {  
        int i = 0;
        char *c;
+       StgWord8 *adj_code;
 
        // determine whether we have 6 or more integer arguments,
        // and therefore need to flush one to the stack.
@@ -519,34 +520,36 @@ createAdjustor(int cconv, StgStablePtr hptr,
 
        if (i < 6) {
            adjustor = allocateExec(0x30,&code);
-
-           *(StgInt32 *)adjustor        = 0x49c1894d;
-           *(StgInt32 *)(adjustor+0x4)  = 0x8948c889;
-           *(StgInt32 *)(adjustor+0x8)  = 0xf28948d1;
-           *(StgInt32 *)(adjustor+0xc)  = 0x48fe8948;
-           *(StgInt32 *)(adjustor+0x10) = 0x000a3d8b;
-           *(StgInt32 *)(adjustor+0x14) = 0x25ff0000;
-           *(StgInt32 *)(adjustor+0x18) = 0x0000000c;
-           *(StgInt64 *)(adjustor+0x20) = (StgInt64)hptr;
-           *(StgInt64 *)(adjustor+0x28) = (StgInt64)wptr;
+            adj_code = (StgWord8*)adjustor;
+
+           *(StgInt32 *)adj_code        = 0x49c1894d;
+           *(StgInt32 *)(adj_code+0x4)  = 0x8948c889;
+           *(StgInt32 *)(adj_code+0x8)  = 0xf28948d1;
+           *(StgInt32 *)(adj_code+0xc)  = 0x48fe8948;
+           *(StgInt32 *)(adj_code+0x10) = 0x000a3d8b;
+           *(StgInt32 *)(adj_code+0x14) = 0x25ff0000;
+           *(StgInt32 *)(adj_code+0x18) = 0x0000000c;
+           *(StgInt64 *)(adj_code+0x20) = (StgInt64)hptr;
+           *(StgInt64 *)(adj_code+0x28) = (StgInt64)wptr;
        }
        else
        {
            adjustor = allocateExec(0x40,&code);
-
-           *(StgInt32 *)adjustor        = 0x35ff5141;
-           *(StgInt32 *)(adjustor+0x4)  = 0x00000020;
-           *(StgInt32 *)(adjustor+0x8)  = 0x49c1894d;
-           *(StgInt32 *)(adjustor+0xc)  = 0x8948c889;
-           *(StgInt32 *)(adjustor+0x10) = 0xf28948d1;
-           *(StgInt32 *)(adjustor+0x14) = 0x48fe8948;
-           *(StgInt32 *)(adjustor+0x18) = 0x00123d8b;
-           *(StgInt32 *)(adjustor+0x1c) = 0x25ff0000;
-           *(StgInt32 *)(adjustor+0x20) = 0x00000014;
+            adj_code = (StgWord8*)adjustor;
+
+           *(StgInt32 *)adj_code        = 0x35ff5141;
+           *(StgInt32 *)(adj_code+0x4)  = 0x00000020;
+           *(StgInt32 *)(adj_code+0x8)  = 0x49c1894d;
+           *(StgInt32 *)(adj_code+0xc)  = 0x8948c889;
+           *(StgInt32 *)(adj_code+0x10) = 0xf28948d1;
+           *(StgInt32 *)(adj_code+0x14) = 0x48fe8948;
+           *(StgInt32 *)(adj_code+0x18) = 0x00123d8b;
+           *(StgInt32 *)(adj_code+0x1c) = 0x25ff0000;
+           *(StgInt32 *)(adj_code+0x20) = 0x00000014;
            
-           *(StgInt64 *)(adjustor+0x28) = (StgInt64)obscure_ccall_ret_code;
-           *(StgInt64 *)(adjustor+0x30) = (StgInt64)hptr;
-           *(StgInt64 *)(adjustor+0x38) = (StgInt64)wptr;
+           *(StgInt64 *)(adj_code+0x28) = (StgInt64)obscure_ccall_ret_code;
+           *(StgInt64 *)(adj_code+0x30) = (StgInt64)hptr;
+           *(StgInt64 *)(adj_code+0x38) = (StgInt64)wptr;
        }
     }
 #elif defined(sparc_HOST_ARCH)
@@ -1121,9 +1124,9 @@ if ( *(unsigned char*)ptr != 0xe8 ) {
  freeStablePtr(((AdjustorStub*)ptr)->hptr);
 #elif defined(x86_64_HOST_ARCH)
  if ( *(StgWord16 *)ptr == 0x894d ) {
-     freeStablePtr(*(StgStablePtr*)(ptr+0x20));
+     freeStablePtr(*(StgStablePtr*)((StgWord8*)ptr+0x20));
  } else if ( *(StgWord16 *)ptr == 0x5141 ) {
-     freeStablePtr(*(StgStablePtr*)(ptr+0x30));
+     freeStablePtr(*(StgStablePtr*)((StgWord8*)ptr+0x30));
  } else {
    errorBelch("freeHaskellFunctionPtr: not for me, guv! %p\n", ptr);
    return;
index 7db88cb..c3944fe 100644 (file)
@@ -1292,7 +1292,7 @@ mmap_again:
 #if defined(x86_64_HOST_ARCH)
    if (mmap_32bit_base != 0) {
        if (result == map_addr) {
-           mmap_32bit_base = map_addr + size;
+           mmap_32bit_base = (StgWord8*)map_addr + size;
        } else {
            if ((W_)result > 0x80000000) {
                // oops, we were given memory over 2Gb
@@ -1310,7 +1310,7 @@ mmap_again:
                // hmm, we were given memory somewhere else, but it's
                // still under 2Gb so we can use it.  Next time, ask
                // for memory right after the place we just got some
-               mmap_32bit_base = (void*)result + size;
+               mmap_32bit_base = (StgWord8*)result + size;
            }
        }
    } else {
index 4bb4118..e0ff690 100644 (file)
@@ -251,6 +251,9 @@ sm/Storage_CC_OPTS  += -Wno-strict-prototypes
 # inlining warnings happen in Compact
 sm/Compact_CC_OPTS += -Wno-inline
 
+# emits warnings about call-clobbered registers on x86_64
+StgCRun_CC_OPTS += -w
+
 RetainerProfile_CC_OPTS += -w
 RetainerSet_CC_OPTS += -Wno-format
 # On Windows: