[SLOF] [PATCH] Fix remaining compiler warnings in sloffs.c

Nikunj A Dadhania nikunj at linux.vnet.ibm.com
Tue Aug 9 12:16:13 AEST 2016


Segher Boessenkool <segher at kernel.crashing.org> writes:

> On Mon, Aug 08, 2016 at 02:45:35PM +0530, Nikunj A Dadhania wrote:
>> >>> In the end, we just might want to add -fno-strict-aliasing to the
>> >>> HOSTCFLAGS, just like we already did it in make.rules for the normal
>> >>> CFLAGS, and call it a day.
>> >> 
>> >> Or you could fix the problems.  SLOF used to work with -fstrict-aliasing,
>> >> and it was a nice performance win.
>> >
>> > That's a question for Nikunj who committed that change a couple of years
>> > ago ...
>> > (see http://git.qemu.org/?p=SLOF.git;a=commitdiff;h=7eca6a5e56f468)
>> 
>> I remember that we had a discussion on this and BenH had suggested that
>> we cannot re-audit all the code for correctness with strict-aliasing. So
>> disable it.
>
> That's what -Wstrict-aliasing is for (needs -fstrict-aliasing active as
> well, to work).
>
> Rewriting the code to make it better can be quite a bit of work, of
> course.  But you could e.g. only use -fno-strict-aliasing on those files
> where -Wstrict-aliasing warns.

I think this is what is needed. I have to test this well, as I am not
exactly sure what was the way we were hitting this.

diff --git a/clients/net-snk/app/netlib/ipv4.c b/clients/net-snk/app/netlib/ipv4.c
index 3a1a789..157d71c 100644
--- a/clients/net-snk/app/netlib/ipv4.c
+++ b/clients/net-snk/app/netlib/ipv4.c
@@ -547,7 +547,7 @@ static void fill_udp_checksum(struct iphdr *ipv4_hdr)
        unsigned i;
        unsigned long checksum = 0;
        struct iphdr ip_hdr;
-       char *ptr;
+       uint16_t *ptr;
        udp_hdr_t *udp_hdr;
 
        udp_hdr = (udp_hdr_t *) (ipv4_hdr + 1);
@@ -559,13 +559,13 @@ static void fill_udp_checksum(struct iphdr *ipv4_hdr)
        ip_hdr.ip_len    = udp_hdr->uh_ulen;
        ip_hdr.ip_p      = ipv4_hdr->ip_p;
 
-       ptr = (char*) udp_hdr;
-       for (i = 0; i < udp_hdr->uh_ulen; i+=2)
-               checksum += *((uint16_t*) &ptr[i]);
+       ptr = (uint16_t*) udp_hdr;
+       for (i = 0; i < udp_hdr->uh_ulen; i++)
+               checksum += ptr[i];
 
-       ptr = (char*) &ip_hdr;
-       for (i = 0; i < sizeof(struct iphdr); i+=2)
-               checksum += *((uint16_t*) &ptr[i]);
+       ptr = (uint16_t*) &ip_hdr;
+       for (i = 0; i < sizeof(struct iphdr); i++)
+               checksum += ptr[i];
 
        checksum = (checksum >> 16) + (checksum & 0xffff);
        checksum += (checksum >> 16);
diff --git a/make.rules b/make.rules
index cbc6353..e78f78d 100644
--- a/make.rules
+++ b/make.rules
@@ -73,7 +73,7 @@ RANLIB                ?= $(CROSS)ranlib
 CPP            ?= $(CROSS)cpp
 
 WARNFLAGS = -Wall -Wmissing-prototypes -Wstrict-prototypes
-CFLAGS ?= -g -O2 -fno-builtin -ffreestanding -nostdinc -msoft-float -fno-strict-aliasing \
+CFLAGS ?= -g -O2 -fno-builtin -ffreestanding -nostdinc -msoft-float \
          -mno-altivec -mabi=no-altivec -fno-stack-protector $(WARNFLAGS)
 
 export CC AS LD CLEAN OBJCOPY OBJDUMP STRIP AR RANLIB CFLAGS
diff --git a/slof/Makefile.inc b/slof/Makefile.inc
index 8ad3337..93b6fda 100644
--- a/slof/Makefile.inc
+++ b/slof/Makefile.inc
@@ -29,7 +29,7 @@ INCLBRDDIR ?= $(TOPBRDDIR)/include
 CPPFLAGS += -I. -I$(INCLCMNDIR) -I$(INCLBRDDIR) -I$(INCLCMNDIR)/$(CPUARCH)
 CFLAGS  = -DTARG=$(TARG) -static -Wall -W -std=gnu99 \
          -O2 -fomit-frame-pointer -msoft-float $(FLAG) $(CPUARCHDEF) \
-         -fno-stack-protector -fno-strict-aliasing 
+         -fno-stack-protector 
 ASFLAGS = -Wa,-mpower4 -Wa,-mregnames $(FLAG) $(CPUARCHDEF)
 
 LDFLAGS += -static -nostdlib -Wl,-q,-n




More information about the SLOF mailing list