[LLVMdev] inlining hint

David Vandevoorde daveed at vandevoorde.com
Thu Aug 27 07:38:46 PDT 2009


On Aug 27, 2009, at 9:53 AM, Cédric Venet wrote:

> David Vandevoorde a écrit :
>> On Aug 27, 2009, at 3:07 AM, Cédric Venet wrote:
>>
>>
>>> David Vandevoorde a écrit :
>>>
>>>> I don't think those are _good_ reasons though: If one doesn't want
>>>> a C+ + function to be inlined, one shouldn't define it inline.
>>>>
>>>>
>>>>
>>> You must not have written a lot of C++ template then.
>>>
>>
>> (Ha!)
>>
>
> :) ok, your name didn't register at first, but I have read (part of)
> your book. sorry for the tone of my reply which was not very friendly
> (It happen often to me with mail, but this is not an excuse). I just
> didn't and still don't understand how you do it, but this is probably
> not the good place to discuses this.
> please accept my sincere apologies.


Apology happily accepted -- no hard feelings!


[...]
>> I don't think that how standard library or STL headers _are_ written
>> determines how they _should be_ written.
>>
>> (Templates don't force us to write excessive inline functions: Leave
>> off the inline keyword and write a member function outside the class
>> template definition, and it's no longer an inline function.)
>>
>
> What about multiple translation unit then? because from my
> understanding, this will generate multiple definition of symbol, so  
> you
> will never be able to link it (except with some strange link
> specification (weak or something like this) which seem less portable
> than declaring the function inline).


The most common practice nowadays is indeed "some strange link  
specification": Linkable template instances are placed in comdat  
sections, and the linker (or loader) ignores duplicate sections.   
That's a theoretically lousy solution (e.g., different instances might  
have been compiled differently), but in practice I haven't seen many  
problems or complaints.  (Note that all this is transparently handled  
by the compiler.)

(Comdat sections are also useful for other C++ compilation artifacts,  
such as spilled inline functions, and certain virtual function tables  
and typeinfo data structures.)

There are other ways to deal with the issue.  Our (EDG) product comes  
with a "prelinker" that assigns instances to a particular object file  
(rerunning the compiler to generate instances): In practice I find it  
not as efficient as the comdat approach, but those customers that  
cannot have linker support have a way forward with it.  Sun also had a  
neat alternative solution to the issue using an instance database of  
sorts, but it doesn't work well will traditional build systems and  
they ended up switching to a comdat-like scheme as well.  See section  
10.4 in "C++ Templates -- The complete guide".



> From the standard:
>
>    Every program shall contain exactly one definition of every
> non-inline function or object that is used in that
>    program; no diagnostic required. The definition can appear
> explicitly in the program, it can be found in the
>    standard or a user-defined library, or (when appropriate) it is
> implicitly defined (see 12.1, 12.4 and 12.8).
>    An inline function shall be defined in every translation unit in
> which it is used.



Those are requirements on source code (essentially); not on  
implementation.  (Note also: function != function template.)

	Daveed





More information about the llvm-dev mailing list