<div dir="ltr">Could other implicit functions (operator=, ctors) have similar issues?</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Sep 13, 2016 at 5:08 PM, Hans Wennborg via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: hans<br>
Date: Tue Sep 13 16:08:20 2016<br>
New Revision: 281395<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=281395&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=281395&view=rev</a><br>
Log:<br>
Try harder to not inline dllimport functions referencing non-dllimport functions<br>
<br>
In r246338, code was added to check for this, but it failed to take into<br>
account implicit destructor invocations because those are not reflected<br>
in the AST. This adds a separate check for them.<br>
<br>
Modified:<br>
    cfe/trunk/lib/CodeGen/<wbr>CodeGenModule.cpp<br>
    cfe/trunk/test/CodeGenCXX/<wbr>dllimport-members.cpp<br>
    cfe/trunk/test/CodeGenCXX/<wbr>dllimport.cpp<br>
<br>
Modified: cfe/trunk/lib/CodeGen/<wbr>CodeGenModule.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=281395&r1=281394&r2=281395&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/CodeGen/<wbr>CodeGenModule.cpp?rev=281395&<wbr>r1=281394&r2=281395&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/CodeGen/<wbr>CodeGenModule.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/<wbr>CodeGenModule.cpp Tue Sep 13 16:08:20 2016<br>
@@ -1740,8 +1740,17 @@ CodeGenModule::<wbr>isTriviallyRecursive(cons<br>
   return Walker.Result;<br>
 }<br>
<br>
-bool<br>
-CodeGenModule::<wbr>shouldEmitFunction(GlobalDecl GD) {<br>
+// Check if T is a class type with a destructor that's not dllimport.<br>
+static bool HasNonDllImportDtor(QualType T) {<br>
+  if (const RecordType *RT = dyn_cast<RecordType>(T))<br>
+    if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT-><wbr>getDecl()))<br>
+      if (RD->getDestructor() && !RD->getDestructor()->hasAttr<<wbr>DLLImportAttr>())<br>
+        return true;<br>
+<br>
+  return false;<br>
+}<br>
+<br>
+bool CodeGenModule::<wbr>shouldEmitFunction(GlobalDecl GD) {<br>
   if (getFunctionLinkage(GD) != llvm::Function::<wbr>AvailableExternallyLinkage)<br>
     return true;<br>
   const auto *F = cast<FunctionDecl>(GD.getDecl(<wbr>));<br>
@@ -1754,6 +1763,18 @@ CodeGenModule::<wbr>shouldEmitFunction(Global<br>
     Visitor.TraverseFunctionDecl(<wbr>const_cast<FunctionDecl*>(F));<br>
     if (!Visitor.SafeToInline)<br>
       return false;<br>
+<br>
+    if (const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(F)<wbr>) {<br>
+      // Implicit destructor invocations aren't captured in the AST, so the<br>
+      // check above can't see them. Check for them manually here.<br>
+      for (const Decl *Member : Dtor->getParent()->decls())<br>
+        if (isa<FieldDecl>(Member))<br>
+          if (HasNonDllImportDtor(cast<<wbr>FieldDecl>(Member)->getType())<wbr>)<br>
+            return false;<br>
+      for (const CXXBaseSpecifier &B : Dtor->getParent()->bases())<br>
+        if (HasNonDllImportDtor(B.<wbr>getType()))<br>
+          return false;<br>
+    }<br>
   }<br>
<br>
   // PR9614. Avoid cases where the source code is lying to us. An available<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/<wbr>dllimport-members.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllimport-members.cpp?rev=281395&r1=281394&r2=281395&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>CodeGenCXX/dllimport-members.<wbr>cpp?rev=281395&r1=281394&r2=<wbr>281395&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CodeGenCXX/<wbr>dllimport-members.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/<wbr>dllimport-members.cpp Tue Sep 13 16:08:20 2016<br>
@@ -44,7 +44,7 @@ void useSpecials() {<br>
 }<br>
<br>
 // Used to force non-trivial special members.<br>
-struct ForceNonTrivial {<br>
+struct __declspec(dllimport) ForceNonTrivial {<br>
   ForceNonTrivial();<br>
   ~ForceNonTrivial();<br>
   ForceNonTrivial(const ForceNonTrivial&);<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/<wbr>dllimport.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllimport.cpp?rev=281395&r1=281394&r2=281395&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>CodeGenCXX/dllimport.cpp?rev=<wbr>281395&r1=281394&r2=281395&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CodeGenCXX/<wbr>dllimport.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/<wbr>dllimport.cpp Tue Sep 13 16:08:20 2016<br>
@@ -347,6 +347,13 @@ __declspec(dllimport) inline int *Refere<br>
 // MO1-DAG: define available_externally dllimport i32* @"\01?<wbr>ReferencingImportedDelete@@<wbr>YAPAHXZ"<br>
 USE(ReferencingImportedNew)<br>
 USE(ReferencingImportedDelete)<br>
+struct ClassWithDtor { ~ClassWithDtor() {} };<br>
+struct __declspec(dllimport) ClassWithNonDllImportField { ClassWithDtor t; };<br>
+struct __declspec(dllimport) ClassWithNonDllImportBase : public ClassWithDtor { };<br>
+USECLASS(<wbr>ClassWithNonDllImportField);<br>
+USECLASS(<wbr>ClassWithNonDllImportBase);<br>
+// MO1-DAG: declare dllimport x86_thiscallcc void @"\01??<wbr>1ClassWithNonDllImportBase@@<wbr>QAE@XZ"(%struct.<wbr>ClassWithNonDllImportBase*)<br>
+// MO1-DAG: declare dllimport x86_thiscallcc void @"\01??<wbr>1ClassWithNonDllImportField@@<wbr>QAE@XZ"(%struct.<wbr>ClassWithNonDllImportField*)<br>
<br>
 // A dllimport function with a TLS variable must not be available_externally.<br>
 __declspec(dllimport) inline void FunctionWithTLSVar() { static __thread int x = 42; }<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>