On Mon, Sep 18, 2006 at 12:09:36PM -0700, Mark Mitchell wrote:
> Mike Stump wrote:
> >On Sep 15, 2006, at 2:32 PM, Ross Ridge wrote:
> >>Also, I don't think it's safe if you merge only functions in COMDAT 
> >>sections.
> >
> >Sure it is, one just needs to merge them as:
> >
> >variant1: nop
> >variant2: nop
> >variant3: nop
> >    [ ... ]
> >
> >this way important inequalities still work.
> 
> Yes, that will work.  But, in practice, people will also want the mode 
> where you do not insert the nops, and just accept that some functions 
> compare equal when they shouldn't.  So, we should have a switch for that 
> mode too.

It certainly is true that if we generate one set of routines for
vector<int>, vector<long>, and vector<T*> for all T, a program that
uses them all could have a lot of nops.

But there's another possibility: we can implement the variants as
inline functions that call the common implementation.  If the address
of the function is not taken in a given file, we can make a direct call.
If the address is taken, we need an "outlined" copy of the function.
These out-of-line copies can be handled in the usual linkonce/COMDAT
way, so that they resolve to one copy.

So it seems that just having address-taking block inlining suffices.

Reply via email to