how to avoid default inlining of static functions at O3 ?

Mihai Donțu mihai.dontu@gmail.com
Mon Sep 29 00:04:00 GMT 2008


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@gmail.com> wrote:
> > From: Mihai Donțu <mihai.dontu@gmail.com>
> > Subject: Re: how to avoid default inlining of static functions at O3   ?
> > To: gcc-help@gcc.gnu.org, fromu2john@yahoo.com
> > 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



More information about the Gcc-help mailing list