diff --git a/libffi/ChangeLog b/libffi/ChangeLog
index 7421806dc8b2213dadcd8e627116763fa6369517..981e5ccdc4767e7e13aa06f01103ccd77afaad36 100644
--- a/libffi/ChangeLog
+++ b/libffi/ChangeLog
@@ -36,6 +36,13 @@
 	* configure.ac: Ditto.
 	* configure: Rebuilt.
 
+2010-04-13  Dan Witte  <dwitte@mozilla.com>
+
+	* msvcc.sh: Build with -W3 instead of -Wall.
+	* src/powerpc/ffi_darwin.c: Remove build warnings.
+	* src/x86/ffi.c: Ditto.
+	* src/x86/ffitarget.h: Ditto.
+
 2010-04-12  Dan Witte  <dwitte@mozilla.com>
 	    Walter Meinl <wuno@lsvw.de>
 
diff --git a/libffi/msvcc.sh b/libffi/msvcc.sh
index 23be1e30ea92a5e7a8ffdc3ad8afc7d5ad558c32..551c73d96559da08e3f96db8da868799b9b7d029 100755
--- a/libffi/msvcc.sh
+++ b/libffi/msvcc.sh
@@ -42,7 +42,7 @@
 # format and translated into something sensible for cl or ml.
 #
 
-args="-nologo -W3"
+args="-nologo"
 md=-MD
 cl="cl"
 ml="ml"
@@ -108,7 +108,8 @@ do
       shift 1
     ;;
     -Wall)
-      args="$args -Wall"
+      # -Wall on MSVC is overzealous. Use -W3 instead.
+      args="$args -W3"
       shift 1
     ;;
     -Werror)
diff --git a/libffi/src/powerpc/ffi_darwin.c b/libffi/src/powerpc/ffi_darwin.c
index d84f1c393a8d5b2c6f489cf799ce74fa27b58330..82265e832b4680677db895f1f3454149eab0e0fb 100644
--- a/libffi/src/powerpc/ffi_darwin.c
+++ b/libffi/src/powerpc/ffi_darwin.c
@@ -344,7 +344,7 @@ ffi_status
 ffi_prep_cif_machdep (ffi_cif *cif)
 {
   /* All this is for the DARWIN ABI.  */
-  int i;
+  unsigned i;
   ffi_type **ptr;
   unsigned bytes;
   int fparg_count = 0, intarg_count = 0;
@@ -542,11 +542,11 @@ ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
     {
     case FFI_AIX:
       ffi_call_AIX(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn,
-		   ffi_prep_args);
+		   FFI_FN(ffi_prep_args));
       break;
     case FFI_DARWIN:
       ffi_call_DARWIN(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn,
-		      ffi_prep_args);
+		      FFI_FN(ffi_prep_args));
       break;
     default:
       FFI_ASSERT(0);
@@ -799,9 +799,9 @@ ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue,
 	  if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE)
 	    size_al = ALIGN (arg_types[i]->size, 8);
 	  if (size_al < 3 && cif->abi == FFI_DARWIN)
-	    avalue[i] = (void *) pgr + 8 - size_al;
+	    avalue[i] = (char *) pgr + 8 - size_al;
 	  else
-	    avalue[i] = (void *) pgr;
+	    avalue[i] = pgr;
 	  pgr += (size_al + 7) / 8;
 #else
 	  /* Structures that match the basic modes (QI 1 byte, HI 2 bytes,
@@ -812,9 +812,9 @@ ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue,
 	  if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE)
 	    size_al = ALIGN(arg_types[i]->size, 8);
 	  if (size_al < 3 && cif->abi == FFI_DARWIN)
-	    avalue[i] = (void*) pgr + 4 - size_al;
+	    avalue[i] = (char*) pgr + 4 - size_al;
 	  else
-	    avalue[i] = (void*) pgr;
+	    avalue[i] = pgr;
 	  pgr += (size_al + 3) / 4;
 #endif
 	  break;
diff --git a/libffi/src/x86/ffi.c b/libffi/src/x86/ffi.c
index 80496532a30882a23b372b183c458c5e280a2a8b..69a4dcddeaa8a2fa24d10e79a184fca19176b53f 100644
--- a/libffi/src/x86/ffi.c
+++ b/libffi/src/x86/ffi.c
@@ -209,7 +209,7 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
 #endif
         {
           cif->flags = FFI_TYPE_STRUCT;
-          // allocate space for return value pointer
+          /* allocate space for return value pointer */
           cif->bytes += ALIGN(sizeof(void*), FFI_SIZEOF_ARG);
         }
       break;
@@ -234,7 +234,7 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
     }
 
 #ifdef X86_WIN64
-  // ensure space for storing four registers
+  /* ensure space for storing four registers */
   cif->bytes += 4 * sizeof(ffi_arg);
 #endif
 
@@ -292,8 +292,8 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
 #ifdef X86_WIN64
     case FFI_WIN64:
       {
-        // Make copies of all struct arguments
-        // NOTE: not sure if responsibility should be here or in caller
+        /* Make copies of all struct arguments
+           NOTE: not sure if responsibility should be here or in caller */
         unsigned int i;
         for (i=0; i < cif->nargs;i++) {
           size_t size = cif->arg_types[i]->size;
diff --git a/libffi/src/x86/ffitarget.h b/libffi/src/x86/ffitarget.h
index 89a8983da9a422e55ab112ce9c010025a472254b..b85016cc01b2f1c51be46ea3d6e3745d140e403d 100644
--- a/libffi/src/x86/ffitarget.h
+++ b/libffi/src/x86/ffitarget.h
@@ -38,7 +38,7 @@
 
 #ifdef X86_WIN64
 #define FFI_SIZEOF_ARG 8
-#define USE_BUILTIN_FFS 0 // not yet implemented in mingw-64 
+#define USE_BUILTIN_FFS 0 /* not yet implemented in mingw-64 */
 #endif
 
 /* ---- Generic type definitions ----------------------------------------- */