On Friday 26 September 2008, john wrote: > Thanks Mihai DonÃu. Is there any compiler option where i can disable > inlining for all the static functions of a program instead of doing that > with __attribute__((noinline)) for each function inside the code. ? I am not aware of such an option or attribute. Sorry. > --- On Sat, 27/9/08, Mihai DonÈu <mihai.dontu@xxxxxxxxx> wrote: > > From: Mihai DonÈu <mihai.dontu@xxxxxxxxx> > > Subject: Re: how to avoid default inlining of static functions at O3 ? > > To: gcc-help@xxxxxxxxxxx, fromu2john@xxxxxxxxx > > Date: Saturday, 27 September, 2008, 12:46 AM > > > > 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