[cfe-commits] r98441 - in /cfe/trunk: lib/CodeGen/CodeGenModule.cpp lib/CodeGen/CodeGenModule.h test/CXX/temp/temp.spec/temp.explicit/p1-emit.cpp test/CodeGenCXX/explicit-instantiation.cpp test/CodeGenCXX/mangle-exprs.cpp test/CodeGenCXX/mangle-t

Douglas Gregor dgregor at apple.com
Mon Mar 15 08:35:16 PDT 2010


On Mar 15, 2010, at 7:57 AM, Rafael Espindola wrote:

>> +  } else if (Linkage == GVA_ExplicitTemplateInstantiation) {
>> +    // An explicit instantiation of a template has weak linkage, since
>> +    // explicit instantiations can occur in multiple translation units
>> +    // and must all be equivalent. However, we are not allowed to
>> +    // throw away these explicit instantiations.
>> +    return llvm::Function::WeakODRLinkage;
> 
> Just for curiosity, why does the c++ standard allows explicit
> instantiations in multiple translation units? I don't see the use of
> that and making a strong definition would make the linking more
> efficient.

I tried nudging C++0x in this direction, to allow us to emit strong definitions for some explicit instantiations, and there was resistance from the C++ committee. The concern is about the use case where we have a template from library A  with a type from library B in two different clients (C and D), both of which used the same instantiations and want to make sure that all of the members of that class template (in library A) are instantiated with that type (in library B). There might be some extern templates thrown in to control where the instantiation happens. Linking C and D together would then be ill-formed, and the committee didn't like that at all.

So, we need to use weak linkage for explicit instantiations. I'll write up a proposed extension for Clang (+ LLVM-GCC) that allows the use of some extra decoration to emit strong definitions.

	- Doug



More information about the cfe-commits mailing list