PATCH: Re: Compilation problem in ndisc.c / 2.5.1-pre2 : possible gcc bug?

Erik Hensema (spamtrap@use.reply-to)
28 Nov 2001 21:04:39 GMT


Brian Gerst (bgerst@didntduck.org) wrote:
>"Richard B. Johnson" wrote:
>>
>> On Wed, 28 Nov 2001, Martin Eriksson wrote:
>> > From: "Richard B. Johnson" <root@chaos.analogic.com>
>> > > On 28 Nov 2001, Erik Hensema wrote:
>> > > > I've been looking into the compile problems of net/ipv6/ndisc.c in
>> > > > 2.5.1-pre2 and I found that the asm generated by gcc (2.95.3) is wrong:
>> > > >
>> > > > This is a small part of a diff betweem two asm files generated by gcc,
>> > note
>> > > > the missing \n's in the wrong code:
>> > >
[code]
>> > > This is probably just some loop unrolling, not some as you say "wrong
>> > > code".
>> >
>> > Correct me if I'm wrong, but I don't think "%edxadcl" really assembles....
>>
>> No, but an edited 'diff' of the assembly output of a 'C' compiler doesn't
>> really tell much. Note, no line numbers, no clue as to what the diff
>> was about. The actual defective section of code would be much more
>> instructive. For instance, is this as a result of an in-line macro
>> expansion; the result of a <CR><LF> 'dos' file; the true output of
>> a 'C' file with no __inline__ __asm__?
>
>It's from include/asm-i386/checksum.h, specifically csum_ipv6_magic().
>The asm statements in this header file need semicolons or explicit
>newlines after each opcode.

You're right, that was the problem.

This patch fixes it:

--- linux/include/asm-i386/checksum.h.orig Wed Nov 28 21:49:00 2001
+++ linux/include/asm-i386/checksum.h Wed Nov 28 21:52:28 2001
@@ -156,17 +156,17 @@
unsigned int sum)
{
__asm__(
- "addl 0(%1), %0"
- "adcl 4(%1), %0"
- "adcl 8(%1), %0"
- "adcl 12(%1), %0"
- "adcl 0(%2), %0"
- "adcl 4(%2), %0"
- "adcl 8(%2), %0"
- "adcl 12(%2), %0"
- "adcl %3, %0"
- "adcl %4, %0"
- "adcl $0, %0"
+ "addl 0(%1), %0 ;\n"
+ "adcl 4(%1), %0 ;\n"
+ "adcl 8(%1), %0 ;\n"
+ "adcl 12(%1), %0 ;\n"
+ "adcl 0(%2), %0 ;\n"
+ "adcl 4(%2), %0 ;\n"
+ "adcl 8(%2), %0 ;\n"
+ "adcl 12(%2), %0 ;\n"
+ "adcl %3, %0 ;\n"
+ "adcl %4, %0 ;\n"
+ "adcl $0, %0 ;\n"
: "=&r" (sum)
: "r" (saddr), "r" (daddr),
"r"(htonl(len)), "r"(htonl(proto)), "0"(sum));

-- 
Erik Hensema (erik@hensema.net)
I'm on the list, no need to Cc: me, though I appreciate one if your
mailer doesn't support the References header.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/