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.sand...@imgtec.com>
Signed-off-by: Toma Tabacu <toma.tab...@imgtec.com>
Suggested-by: Maciej W. Rozycki <ma...@linux-mips.org>
Cc: Ralf Baechle <r...@linux-mips.org>
Cc: Markos Chandras <markos.chand...@imgtec.com>
Cc: Leonid Yegoshin <leonid.yegos...@imgtec.com>
Cc: Maciej W. Rozycki <ma...@linux-mips.org>
Cc: linux-m...@linux-mips.org
Cc: linux-kernel@vger.kernel.org

---

Rewrote the patch following Maciej's suggestion where he observed that
the assembly was somewhat strange and suggested correcting the
constraints and using a local of matching type.

 arch/mips/include/asm/checksum.h | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/arch/mips/include/asm/checksum.h b/arch/mips/include/asm/checksum.h
index 3418c51..48bfcaf 100644
--- a/arch/mips/include/asm/checksum.h
+++ b/arch/mips/include/asm/checksum.h
@@ -228,6 +228,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"
@@ -280,9 +282,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);
 }
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to