Name: Eliminate Unused Functions Author: Rusty Russell Status: Tested on 2.5.70-bk16 GCC 3.3 has the ability to eliminate unused static functions. This includes code like this: static int unusedfunc(void) { ... }; int otherfunc(void) { (void)unusedfunc; ... This means that macros can suppress the "unused" warning on functions without preventing the function elimination. This should allow us to remove a number of #ifdefs around unused functions. Unfortunately, this elimination is only performed if -finline-functions is used. In order to prevent GCC automatically inlining anything, we also specify "--param max-inline-insns-auto=0". Earlier compilers don't understand this parameter, so we test for it at build time. Results: gcc 3.3 without patch: -rwxrwxr-x 1 rusty rusty 5115166 Jun 13 09:17 vmlinux gcc 3.3 with patch: -rwxrwxr-x 1 rusty rusty 5115166 Jun 13 09:58 vmlinux gcc 3.3 without patch (small unused function added): -rwxrwxr-x 1 rusty rusty 5115195 Jun 13 10:14 vmlinux gcc 3.3 with patch (small unused function added): -rwxrwxr-x 1 rusty rusty 5115166 Jun 13 10:15 vmlinux diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal working-2.5.70-bk16-check_region/Makefile working-2.5.70-bk16-check_region-inline/Makefile --- working-2.5.70-bk16-check_region/Makefile 2003-06-12 09:57:39.000000000 +1000 +++ working-2.5.70-bk16-check_region-inline/Makefile 2003-06-12 21:34:40.000000000 +1000 @@ -213,10 +213,12 @@ CFLAGS_KERNEL = AFLAGS_KERNEL = NOSTDINC_FLAGS = -nostdinc -iwithprefix include +# Needs gcc 3.3 or above to understand max-inline-insns-auto. +INLINE_OPTS := $(shell $(CC) -o /non/existent/file -c --param max-inline-insns-auto=0 -xc /dev/null 2>&1 | grep /non/existent/file >/dev/null && echo -finline-functions --param max-inline-insns-auto=0) CPPFLAGS := -D__KERNEL__ -Iinclude CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes -Wno-trigraphs -O2 \ - -fno-strict-aliasing -fno-common + $(INLINE_OPTS) -fno-strict-aliasing -fno-common AFLAGS := -D__ASSEMBLY__ $(CPPFLAGS) export VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION KERNELRELEASE ARCH \