MIPS: LLVMLinux: Fix an 'inline asm input/output type mismatch' error.
authorDaniel Sanders <daniel.sanders@imgtec.com>
Tue, 24 Feb 2015 15:25:10 +0000 (15:25 +0000)
committerRalf Baechle <ralf@linux-mips.org>
Wed, 1 Apr 2015 15:21:47 +0000 (17:21 +0200)
Replace incorrect matching constraint that caused the error with an alternative
that still has the required constraints on the inline assembly.

This is the error message reported by clang:
arch/mips/include/asm/checksum.h:285:27: error: unsupported inline asm: input with type '__be32' (aka 'unsigned int') matching output with type 'unsigned short'
          "0" (htonl(len)), "1" (htonl(proto)), "r" (sum));
                                 ^~~~~~~~~~~~

The changed code can be compiled successfully by both gcc and clang.

Signed-off-by: Daniel Sanders <daniel.sanders@imgtec.com>
Signed-off-by: Toma Tabacu <toma.tabacu@imgtec.com>
Suggested-by: Maciej W. Rozycki <macro@linux-mips.org>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Markos Chandras <markos.chandras@imgtec.com>
Cc: Leonid Yegoshin <Leonid.Yegoshin@imgtec.com>
Cc: linux-mips@linux-mips.org
Cc: linux-kernel@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/9313/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/include/asm/checksum.h

index 5c585c5c1c3e3fe3ee6bacdfd8ce0f59be82e27e..3ceacde5eb6e4fd3a7b05906ce3fe153b57c8e5c 100644 (file)
@@ -218,6 +218,8 @@ static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
                                          __u32 len, unsigned short proto,
                                          __wsum sum)
 {
+       __wsum tmp;
+
        __asm__(
        "       .set    push            # csum_ipv6_magic\n"
        "       .set    noreorder       \n"
@@ -270,9 +272,9 @@ static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
 
        "       addu    %0, $1          # Add final carry\n"
        "       .set    pop"
-       : "=r" (sum), "=r" (proto)
+       : "=&r" (sum), "=&r" (tmp)
        : "r" (saddr), "r" (daddr),
-         "0" (htonl(len)), "1" (htonl(proto)), "r" (sum));
+         "0" (htonl(len)), "r" (htonl(proto)), "r" (sum));
 
        return csum_fold(sum);
 }