Is a function actually inlined?

Igor Pechtchanski pechtcha@cs.nyu.edu
Wed Oct 8 17:27:00 GMT 2003


On Wed, 8 Oct 2003, Alex Vinokur wrote:

> "Igor Pechtchanski" <pechtcha@cs.nyu.edu> wrote in message news:Pine.GSO.4.56.0310081236250.15176@slinky.cs.nyu.edu...
> > On Wed, 8 Oct 2003, Alex Vinokur wrote:
> >
> > > "Corinna Vinschen" wrote in message news:20031008100004.GC2070@cygbert.vinschen.de...
> > > > On Wed, Oct 08, 2003 at 11:19:27AM +0200, Alex Vinokur wrote:
> > > > > How can one know if a function requested to be inlined is actually
> > > > > inlined?
> > > >
> > > > A look into the assembler output generated by gcc/g++ will show you.
> > >
> > > How can one conclude if a function is actually inlined on the basis
> > > working with the nm and objdump utilities? For instance, are 'the foo2()
> > > and foo3() function from my original posting' actually inlined?
> >
> > The general rule of thumb is: if there's a call to a function, it's not
> > inlined.
> >
> > > $ grep foo t.s
> > >
> > > .globl __ZN3Foo4foo1Ev
> > >  .def __ZN3Foo4foo1Ev; .scl 2; .type 32; .endef
> > > __ZN3Foo4foo1Ev:
> > >  call __ZN3Foo4foo1Ev
> > >  call __ZN3Foo4foo2Ev
> > >  call __ZN3Foo4foo3Ev
> >    ^^^^^^^^^^^^^^^^^^^^
> > FWIW, it doesn't look like they are inlined.
>
> On the other hand we don't see
> * call foo2()
>   and
> * call foo3()
> here :
>
> $ objdump -CS t.o | grep foo
                           ^^^
s/foo/call/?

>   1a: e8 00 00 00 00        call   1f <main+0x19>
>   1f: e8 00 00 00 00        call   24 <main+0x1e>
>   2a: e8 d1 ff ff ff        call   0 <Foo::foo1()>
>   35: e8 00 00 00 00        call   3a <main+0x34>
>   40: e8 00 00 00 00        call   45 <main+0x3f>

Yes, apparently the .s file is not the final assembly output -- some
transformations do happen between that and the object file.  So, look at
the output of objdump and see if there are calls to those functions.

One thing to note is that in gcc (as in many other compilers) inlining can
happen at different levels.  What you're probably seeing here, IMO, is a
peephole optimization that inlines any empty functions, rather than gcc
considering the 'inline' keyword.

So, to answer your original question, I don't think the 'inline' keyword
influenced the final binary, but the functions did get inlined by some
other mechanism.
	Igor
-- 
				http://cs.nyu.edu/~pechtcha/
      |\      _,,,---,,_		pechtcha@cs.nyu.edu
ZZZzz /,`.-'`'    -.  ;-;;,_		igor@watson.ibm.com
     |,4-  ) )-,_. ,\ (  `'-'		Igor Pechtchanski, Ph.D.
    '---''(_/--'  `-'\_) fL	a.k.a JaguaR-R-R-r-r-r-.-.-.  Meow!

"I have since come to realize that being between your mentor and his route
to the bathroom is a major career booster."  -- Patrick Naughton

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/



More information about the Cygwin mailing list