https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78932
Bug ID: 78932
Summary: [ARM] -O2 generates wrong code
Product: gcc
Version: 4.5.3
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: xqr4n54r1 at hotmail dot com
Target Milestone: ---
Host: arm-linux
Target: arm-linux-uclibcgnueabi
Build: x86_64-pc-linux-gnu
Created attachment 40414
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=40414=edit
Attachment has following : - filter_with_O2.{c|i|s} : Indicates that the
problem has occurred. - filter_without_bbro.{c|i|s} : Indicates solution that
compile without bbro I mentioned above as 1.
I compiled the linux-2.6.27
(https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tag/?h=v2.6.37)
for broadcom arm. I noticed that the chksum of some TCP packages was broken. I
found the function (sk_run_filter:filter.c) that was the problem, and I made
the following changes on it to fix the problem.
1. unsigned int __attribute__((optimize("-fno-reorder-blocks")))
sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen)
2. unsigned int __attribute__((optimize("-Os"))) sk_run_filter(struct sk_buff
*skb, struct sock_filter *filter, int flen)
3. unsigned int __attribute__((optimize("-O1"))) sk_run_filter(struct sk_buff
*skb, struct sock_filter *filter, int flen)
4. static void *load_pointer(struct sk_buff *skb, int k, unsigned int size,
void *buffer) -> the inline function used is removed inline keyword.
--> These above results brought me to a bug of optimize gcc.
Compile options:
arm-linux-gcc -Wp,-MD,net/core/.filter.o.d -nostdinc -isystem
/usr/lib/arm-linux-uclibcgnueabi/4.5.3/include
-I/kernel/linux-2_6.37/arch/arm/include -Iinclude -include
include/generated/autoconf.h -D__KERNEL__ -mlittle-endian
-Iarch/arm/mach-brcm-hnd/include -Iarch/arm/plat-brcm/include -Wall -Wundef
-Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common
-Werror-implicit-function-declaration -Wno-format-security
-fno-delete-null-pointer-checks -fwrapv -Dlinux -DHNDCTF -DCTFPOOL -DCTFMAP
-DPKTC -DCTF_IPV6 -O2 -marm -ffreestanding -fno-dwarf2-cfi-asm
-mabi=aapcs-linux -mno-thumb-interwork -funwind-tables -D__LINUX_ARM_ARCH__=7
-march=armv7-a -msoft-float -Uarm -ggdb -Wframe-larger-than=2048
-fno-stack-protector -fomit-frame-pointer -Wdeclaration-after-statement
-Wno-pointer-sign -fno-strict-overflow -fconserve-stack
-D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(filter)"
-D"KBUILD_MODNAME=KBUILD_STR(filter)" -c -o net/core/.tmp_filter.o
net/core/filter.c
--
Attachment has following :
- filter_with_O2.{c|i|s} : Indicates that the problem has occurred.
- filter_without_bbro.{c|i|s} : Indicates solution that compile without bbro
I mentioned above as 1.
- filter_without_inline.{c|i|s} : Indicates solution that compile without
inline I mentioned above as 4.