rnk added inline comments.

================
Comment at: clang/lib/AST/ASTContext.cpp:9552
+    // overwrite linkage of explicit template instantiation
+    // definition/declaration.
+    return GVA_DiscardableODR;
----------------
takuto.ikuta wrote:
> hans wrote:
> > takuto.ikuta wrote:
> > > hans wrote:
> > > > takuto.ikuta wrote:
> > > > > takuto.ikuta wrote:
> > > > > > hans wrote:
> > > > > > > Can you give an example for why this is needed?
> > > > > > Sorry, this change does not need. Removed.
> > > > > Sorry, this change is necessary still.
> > > > > 
> > > > > Without this, definition of inline function in explicit template 
> > > > > instantiation declaration is not be emitted, due to 
> > > > > GVA_AvailableExternally linkage.
> > > > > But we stop exporting definition of inline function in explicit 
> > > > > template instantiation definition too.
> > > > > 
> > > > > So without this, definition of dllimported inline function of 
> > > > > explicit template instantiation declaration won't be available.
> > > > > 
> > > > Can you provide a code example of why this is needed?
> > > If we don't change function linkage, following code will be compiled like 
> > > below with -fno-dllexport-inlines.
> > > 
> > > ```
> > > template<typename>
> > > class M{
> > > public:
> > >   void foo() {}
> > > };
> > > 
> > > template class __declspec(dllexport) M<int>;
> > > 
> > > extern template class __declspec(dllimport) M<short>;
> > > 
> > > void f (){
> > >   M<int> mi;
> > >   mi.foo();
> > > 
> > >   M<short> ms;
> > >   ms.foo();
> > > }
> > > ```
> > > 
> > > ```
> > > $"?foo@?$M@H@@QEAAXXZ" = comdat any
> > > 
> > > ; Function Attrs: noinline nounwind optnone
> > > define weak_odr dso_local void @"?foo@?$M@H@@QEAAXXZ"(%class.M* %this) #0 
> > > comdat align 2 {
> > > entry:
> > >   %this.addr = alloca %class.M*, align 8
> > >   store %class.M* %this, %class.M** %this.addr, align 8
> > >   %this1 = load %class.M*, %class.M** %this.addr, align 8
> > >   ret void
> > > }
> > > 
> > > ; Function Attrs: noinline nounwind optnone
> > > define dso_local void @"?f@@YAXXZ"() #0 {
> > > entry:
> > >   %mi = alloca %class.M, align 1
> > >   %ms = alloca %class.M.0, align 1
> > >   call void @"?foo@?$M@H@@QEAAXXZ"(%class.M* %mi)
> > >   call void @"?foo@?$M@F@@QEAAXXZ"(%class.M.0* %ms)
> > >   ret void
> > > }
> > > 
> > > declare dso_local void @"?foo@?$M@F@@QEAAXXZ"(%class.M.0*) #1
> > > ```
> > > 
> > > M<short>::foo() is declared, but inline function is not dllexported (See 
> > > M<int>::foo() is not dllexported). So this code cannot be linked because 
> > > definition of M<short>::foo does not exist. If the function is properly 
> > > inlined, we don't need to have this code. But I'm not sure why the 
> > > function is not inlined.
> > Interesting. I wonder how -fvisibility-inlines-hidden handles this...
> > 
> > 
> > ```
> > template <typename> struct S {
> >   void foo() {}
> > };
> > 
> > template struct S<int>;
> > 
> > void use() {
> >   S<int> s;
> >   s.foo();
> > }
> > 
> > $ g++ -fvisibility-inlines-hidden -c a.cc && objdump -t a.o | grep 
> > _ZN1SIiE3fooEv
> > 0000000000000000 l    d  .text._ZN1SIiE3fooEv       0000000000000000 
> > .text._ZN1SIiE3fooEv
> > 0000000000000000  w    F .text._ZN1SIiE3fooEv       000000000000000b 
> > _ZN1SIiE3fooEv  <--- Not hidden.
> > ```
> > 
> > (If I comment out the explicit instantiation definition above, foo() is 
> > hidden as expected.)
> > 
> > Okay, it seems that for explicit instantiation definitions, 
> > -fvisibility-inlines-hidden does not apply.
> > 
> > And thinking more about it, that makes sense.
> > 
> > I don't think we should change the linkage like this though, I think we 
> > should just not apply the /Zc:dllexportInlines- for explicit instantiation 
> > decls and definitions in checkClassLevelDLLAttribute(). I realize you had 
> > code to check for this before, but now we have a good and well understood 
> > reason.
> Thank you for confirmation. I revived the check.
I agree, this option should not affect explicit instantiations. Inline 
functions from explicit instantiations should still be exported+weak_odr, and 
imported+available_externally for extern declarations.


https://reviews.llvm.org/D51340



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to