On Friday 26 September 2008, john wrote: > Hi, > I am using gcc 3.4.6 (gcc version 3.4.6 20060404 (Red Hat 3.4.6-3)) > and trying a simple C program which was given at the end of this mail along > with its assembly code. > > I am compiling the program using -O3 >From gcc info page (function attributes): `noinline': This function attribute prevents a function from being considered for inlining. __attribute__((noinline)) static void test2(); > /usr/bin/gcc -c -pipe -m32 -D_REENTRANT -fPIC -W -Wall -Wextra -O -O3 > -DSERVER -DMONITORS -DHA_KEY='"NONE"' test.c -S -o test.s > > I see that at optimization level O3, the compiler is defaultly inlining my > static functions. Is there a way to avoid inlining static functions for C > programs ? > > > -fno-inline may avoid inlining all functions. There is -fno-default-inline, > but that is for C++. > > Thanks for any help in advance, > Regards > --John > > > > #include<stdio.h> > void test(int a, int b, int c) > { > int d; > d=a*b*c; > printf("%d * %d * %d is %d\n",a,b,c,d); > } > > > > static void test2(int a, int b, int c) > { > int d; > d=a+b+c; > printf("%d + %d + %d is %d\n",a,b,c,d); > } > > int main(int argc, char *argv[]) > { > test(1,2,3); > test2(4,5,6); > } > > > > .file "test.c" > .section .rodata.str1.1,"aMS",@ > progbits,1 > ..LC0: > .string "%d * %d * %d is %d\n" > .text > .p2align 2,,3 > ..globl test > .type test, @function > test: > pushl %ebp > movl %esp, %ebp > pushl %esi > movl 8(%ebp), %esi > movl 12(%ebp), %ecx > movl %esi, %eax > pushl %ebx > movl 16(%ebp), %edx > imull %ecx, %eax > subl $12, %esp > imull %edx, %eax > pushl %eax > pushl %edx > pushl %ecx > call .L2 > ..L2: > popl %ebx > addl $_GLOBAL_OFFSET_TABLE_+[.-.L2] , %ebx > pushl %esi > leal .LC0@GOTOFF(%ebx), %eax > pushl %eax > call printf@PLT > leal -8(%ebp), %esp > popl %ebx > popl %esi > leave > ret > .size test, .-test > .section .rodata.str1.1 > ..LC1: > .string "%d + %d + %d is %d\n" > .text > .p2align 2,,3 > ..globl main > .type main, @function > main: > pushl %ebp > movl %esp, %ebp > pushl %ebx > pushl %eax > andl $-16, %esp > subl $20, %esp > pushl $3 > pushl $2 > pushl $1 > call .L5 > ..L5: > popl %ebx > addl $_GLOBAL_OFFSET_TABLE_+[.-.L5] , %ebx > call test@PLT > movl $15, (%esp) > pushl $6 > pushl $5 > pushl $4 > leal .LC1@GOTOFF(%ebx), %eax > pushl %eax > call printf@PLT > addl $32, %esp > movl -4(%ebp), %ebx > leave > ret > .size main, .-main > .section .note.GNU-stack,"",@progbits > .ident "GCC: (GNU) 3.4.6 20060404 (Red Hat 3.4.6-3)" -- Mihai Donțu