Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com X-Authentication-Warning: slinky.cs.nyu.edu: pechtcha owned process doing -bs Date: Wed, 8 Oct 2003 13:05:13 -0400 (EDT) From: Igor Pechtchanski Reply-To: cygwin AT cygwin DOT com To: Alex Vinokur cc: cygwin AT cygwin DOT com Subject: Re: Is a function actually inlined? In-Reply-To: Message-ID: References: Importance: Normal MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII On Wed, 8 Oct 2003, Alex Vinokur wrote: > "Igor Pechtchanski" wrote in message news:Pine DOT GSO DOT 4 DOT 56 DOT 0310081236250 DOT 15176 AT slinky DOT cs DOT nyu DOT edu... > > On Wed, 8 Oct 2003, Alex Vinokur wrote: > > > > > "Corinna Vinschen" wrote in message news:20031008100004 DOT GC2070 AT cygbert DOT vinschen DOT 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 > 1f: e8 00 00 00 00 call 24 > 2a: e8 d1 ff ff ff call 0 > 35: e8 00 00 00 00 call 3a > 40: e8 00 00 00 00 call 45 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 AT cs DOT nyu DOT edu ZZZzz /,`.-'`' -. ;-;;,_ igor AT watson DOT ibm DOT 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/