[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