<div>If the thinks are not imported, why would it make sense to export them?</div><div><br></div><div>Maybe devirtualization could trigger this?</div><div><br><div class="gmail_quote"><div>On Wed, Jul 5, 2017 at 1:17 PM Shoaib Meenai <<a href="mailto:smeenai@fb.com">smeenai@fb.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The thunks are (as far as I know, at least) only referenced from vtables, so<br>
there's no opportunity to perform indirect calls via the IAT for them. The<br>
vtable would just end up referencing the linker-generated import thunk<br>
instead.<br>
<br>
I can play around with marking the thunks as dllimport if the function being<br>
thunked is dllimport, but I was curious if you had any specific scenarios in<br>
mind where you thought it would make a difference.<br>
<br>
From: cfe-commits <<a href="mailto:cfe-commits-bounces@lists.llvm.org" target="_blank">cfe-commits-bounces@lists.llvm.org</a>> on behalf of David Majnemer via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>><br>
Reply-To: David Majnemer <<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>><br>
Date: Tuesday, July 4, 2017 at 8:42 AM<br>
To: Shoaib Meenai via Phabricator <<a href="mailto:reviews@reviews.llvm.org" target="_blank">reviews@reviews.llvm.org</a>>, "<a href="mailto:compnerd@compnerd.org" target="_blank">compnerd@compnerd.org</a>" <<a href="mailto:compnerd@compnerd.org" target="_blank">compnerd@compnerd.org</a>>, "<a href="mailto:reviews%2BD34972%2Bpublic%2B8a22767368a5b974@reviews.llvm.org" target="_blank">reviews+D34972+public+8a22767368a5b974@reviews.llvm.org</a>" <<a href="mailto:reviews%2BD34972%2Bpublic%2B8a22767368a5b974@reviews.llvm.org" target="_blank">reviews+D34972+public+8a22767368a5b974@reviews.llvm.org</a>>, "<a href="mailto:rnk@google.com" target="_blank">rnk@google.com</a>" <<a href="mailto:rnk@google.com" target="_blank">rnk@google.com</a>><br>
Cc: "<a href="mailto:zturner@google.com" target="_blank">zturner@google.com</a>" <<a href="mailto:zturner@google.com" target="_blank">zturner@google.com</a>>, "<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>" <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>><br>
Subject: Re: [PATCH] D34972: [CodeGen] Propagate dllexport to thunks<br>
<br>
What about the import side?<br>
<br>
On Mon, Jul 3, 2017 at 10:37 PM Shoaib Meenai via Phabricator via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:<br>
smeenai created this revision.<br>
<br>
Under Windows Itanium, we need to export virtual and non-virtual thunks<br>
if the functions being thunked are exported. These thunks would<br>
previously inherit their dllexport attribute from the declaration, but<br>
r298330 changed declarations to not have dllexport attributes. We<br>
therefore need to add the dllexport attribute to the definition<br>
ourselves now. This is consistent with MinGW GCC's behavior.<br>
<br>
This redoes r306770 but limits the logic to Itanium. MicrosoftCXXABI's<br>
setThunkLinkage ensures that thunks aren't exported under that ABI, so<br>
I'm handling this in ItaniumCXXABI's setThunkLinkage for symmetry.<br>
<br>
<br>
<a href="https://reviews.llvm.org/D34972" rel="noreferrer" target="_blank">https://reviews.llvm.org/D34972</a><br>
<br>
Files:<br>
  lib/CodeGen/ItaniumCXXABI.cpp<br>
  test/CodeGenCXX/dllexport-vtable-thunks.cpp<br>
<br>
<br>
Index: test/CodeGenCXX/dllexport-vtable-thunks.cpp<br>
===================================================================<br>
--- /dev/null<br>
+++ test/CodeGenCXX/dllexport-vtable-thunks.cpp<br>
@@ -0,0 +1,23 @@<br>
+// RUN: %clang_cc1 -triple x86_64-windows-gnu -fdeclspec -emit-llvm -o - %s | FileCheck %s<br>
+// RUN: %clang_cc1 -triple x86_64-windows-itanium -fdeclspec -emit-llvm -o - %s | FileCheck %s<br>
+<br>
+struct __declspec(dllexport) A {<br>
+  virtual void m();<br>
+};<br>
+struct __declspec(dllexport) B {<br>
+  virtual void m();<br>
+};<br>
+struct __declspec(dllexport) C : A, B {<br>
+  virtual void m();<br>
+};<br>
+void C::m() {}<br>
+// CHECK: define dllexport void @_ZThn8_N1C1mEv<br>
+<br>
+struct Base {<br>
+  virtual void m();<br>
+};<br>
+struct __declspec(dllexport) Derived : virtual Base {<br>
+  virtual void m();<br>
+};<br>
+void Derived::m() {}<br>
+// CHECK: define dllexport void @_ZTv0_n24_N7Derived1mEv<br>
Index: lib/CodeGen/ItaniumCXXABI.cpp<br>
===================================================================<br>
--- lib/CodeGen/ItaniumCXXABI.cpp<br>
+++ lib/CodeGen/ItaniumCXXABI.cpp<br>
@@ -284,6 +284,11 @@<br>
     // linkage together with vtables when needed.<br>
     if (ForVTable && !Thunk->hasLocalLinkage())<br>
       Thunk->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);<br>
+<br>
+    // Propagate dllexport storage.<br>
+    const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());<br>
+    if (MD->hasAttr<DLLExportAttr>())<br>
+      Thunk->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);<br>
   }<br>
<br>
   llvm::Value *performThisAdjustment(CodeGenFunction &CGF, Address This,<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">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/mailman/listinfo/cfe-commits</a><br>
<br>
<br>
</blockquote></div></div>