The following (contrived) example was compiled with -O3 -fwhole-program. void func1() { } void func2(void(*fn)(void)) { fn(); } void func3() { func2(&func1); }
int main() { return 0; } running objdump on the output results in 00000000 <func1>: 0: 4e 80 00 20 blr 00000004 <main>: 4: 94 21 ff f8 stwu r1,-8(r1) 8: 7c 08 02 a6 mflr r0 c: 90 01 00 0c stw r0,12(r1) 10: 48 00 00 01 bl 10 <main+0xc> 14: 80 01 00 0c lwz r0,12(r1) 18: 38 60 00 00 li r3,0 1c: 38 21 00 08 addi r1,r1,8 20: 7c 08 03 a6 mtlr r0 24: 4e 80 00 20 blr I don't expect any code for func1 to be emitted. It is never called, and func3 which takes it's address has been removed. This is obviously a bigger problem if func2 were to do some real work. compiler output: powerpc-eabispe-gcc -O3 -fwhole-program -v -c tes t.c Using built-in specs. Target: powerpc-eabispe Configured with: /home/patrick/src/e7/toolchain/src/gcc-4.3.2/configure --prefix=/home/patrick/src/e7/toolchain/stage2 --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=powerpc-eabispe --enable-languages=c --disable-nls --disable-werror --without-newlib --with-gmp=/home/patrick/src/e7/toolchain/stage2 --with-mpfr=/home/patrick/src/e7/toolchain/stage2 --disable-shared --disable-debug --disable-libssp Thread model: single gcc version 4.3.2 (GCC) COLLECT_GCC_OPTIONS='-O3' '-fwhole-program' '-v' '-c' /home/patrick/src/e7/toolchain/stage2/libexec/gcc/powerpc-eabispe/4.3.2/cc1 -quiet -v test.c -quiet -dumpbase test.c -auxbase test -O3 -version -fwhole-program -o /tmp/ccHjWmTp.s ignoring nonexistent directory "/home/patrick/src/e7/toolchain/stage2/lib/gcc/powerpc-eabispe/4.3.2/../../../../powerpc-eabispe/sys-include" ignoring nonexistent directory "/home/patrick/src/e7/toolchain/stage2/lib/gcc/powerpc-eabispe/4.3.2/../../../../powerpc-eabispe/include" #include "..." search starts here: #include <...> search starts here: /home/patrick/src/e7/toolchain/stage2/lib/gcc/powerpc-eabispe/4.3.2/include /home/patrick/src/e7/toolchain/stage2/lib/gcc/powerpc-eabispe/4.3.2/include-fixed End of search list. GNU C (GCC) version 4.3.2 (powerpc-eabispe) compiled by GNU C version 4.2.3 (Ubuntu 4.2.3-2ubuntu7), GMP version 4.2.4, MPFR version 2.3.2. GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: c30b16423d0b6addaa52d5eb1153852d COLLECT_GCC_OPTIONS='-O3' '-fwhole-program' '-v' '-c' /home/patrick/src/e7/toolchain/stage2/lib/gcc/powerpc-eabispe/4.3.2/../../../../powerpc-eabispe/bin/as -mppc -mspe -me500 -many -V -Qy -o test.o /tmp/ccHjWmTp.s GNU assembler version 2.18 (powerpc-eabispe) using BFD version (GNU Binutils) 2.18 COMPILER_PATH=/home/patrick/src/e7/toolchain/stage2/libexec/gcc/powerpc-eabispe/4.3.2/:/home/patrick/src/e7/toolchain/stage2/libexec/gcc/powerpc-eabispe/4.3.2/:/home/patrick/src/e7/toolchain/stage2/libexec/gcc/powerpc-eabispe/:/home/patrick/src/e7/toolchain/stage2/lib/gcc/powerpc-eabispe/4.3.2/:/home/patrick/src/e7/toolchain/stage2/lib/gcc/powerpc-eabispe/:/home/patrick/src/e7/toolchain/stage2/lib/gcc/powerpc-eabispe/4.3.2/../../../../powerpc-eabispe/bin/ LIBRARY_PATH=/home/patrick/src/e7/toolchain/stage2/lib/gcc/powerpc-eabispe/4.3.2/:/home/patrick/src/e7/toolchain/stage2/lib/gcc/powerpc-eabispe/4.3.2/../../../../powerpc-eabispe/lib/ COLLECT_GCC_OPTIONS='-O3' '-fwhole-program' '-v' '-c' -- Summary: missed optimisation: function referenced through unused function pointer not removed Product: gcc Version: 4.3.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: patrick at motec dot com dot au http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38378