<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Aug 28, 2014 at 5:16 PM, Hans Wennborg <span dir="ltr"><<a href="mailto:hans@hanshq.net" target="_blank">hans@hanshq.net</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: Thu Aug 28 19:16:06 2014<br>
New Revision: 216699<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=216699&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=216699&view=rev</a><br>
Log:<br>
Better codegen support for DLL attributes being dropped after the first declaration (PR20792)<br>
<br>
For the following code:<br>
<br>
  __declspec(dllimport) int f(int x);<br>
  int user(int x) {<br>
    return f(x);<br>
  }<br>
  int f(int x) { return 1; }<br>
<br>
Clang will drop the dllimport attribute in the AST, but CodeGen would have<br>
already put it on the LLVM::Function, and that would never get updated.<br>
(The same thing happens for global variables.)<br>
<br>
This makes Clang check dropped DLL attribute case each time the LLVM object<br>
is referenced.<br>
<br>
This isn't perfect, because we will still get it wrong if the function is<br>
never referenced by codegen after the attribute is dropped,</blockquote><div><br></div><div>Is there a test case for this case?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> but this handles<br>
the common cases and makes us not fail in the verifier.<br>
<br>
Modified:<br>
    cfe/trunk/lib/CodeGen/CodeGenModule.cpp<br>
    cfe/trunk/test/CodeGen/dllimport.c<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=216699&r1=216698&r2=216699&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=216699&r1=216698&r2=216699&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Thu Aug 28 19:16:06 2014<br>
@@ -1449,6 +1449,10 @@ CodeGenModule::GetOrCreateLLVMFunction(S<br>
         Entry->setLinkage(llvm::Function::ExternalLinkage);<br>
     }<br>
<br>
+    // Handle dropped DLL attributes.<br>
+    if (D && !D->hasAttr<DLLImportAttr>() && !D->hasAttr<DLLExportAttr>())<br>
+      Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);<br>
+<br>
     if (Entry->getType()->getElementType() == Ty)<br>
       return Entry;<br>
<br>
@@ -1614,6 +1618,10 @@ CodeGenModule::GetOrCreateLLVMGlobal(Str<br>
         Entry->setLinkage(llvm::Function::ExternalLinkage);<br>
     }<br>
<br>
+    // Handle dropped DLL attributes.<br>
+    if (D && !D->hasAttr<DLLImportAttr>() && !D->hasAttr<DLLExportAttr>())<br>
+      Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);<br>
+<br>
     if (Entry->getType() == Ty)<br>
       return Entry;<br>
<br>
<br>
Modified: cfe/trunk/test/CodeGen/dllimport.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/dllimport.c?rev=216699&r1=216698&r2=216699&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/dllimport.c?rev=216699&r1=216698&r2=216699&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/dllimport.c (original)<br>
+++ cfe/trunk/test/CodeGen/dllimport.c Thu Aug 28 19:16:06 2014<br>
@@ -44,12 +44,19 @@ __declspec(dllimport) extern int GlobalR<br>
                       extern int GlobalRedecl3; // dllimport ignored<br>
 USEVAR(GlobalRedecl3)<br>
<br>
+// Make sure this works even if the decl has been used before it's defined (PR20792).<br>
+// CHECK: @GlobalRedecl4 = common global i32<br>
+__declspec(dllimport) extern int GlobalRedecl4;<br>
+USEVAR(GlobalRedecl4)<br>
+                      int GlobalRedecl4; // dllimport ignored<br>
+<br>
+<br>
 // Redeclaration in local context.<br>
-// CHECK: @GlobalRedecl4 = external dllimport global i32<br>
-__declspec(dllimport) int GlobalRedecl4;<br>
+// CHECK: @GlobalRedecl5 = external dllimport global i32<br>
+__declspec(dllimport) int GlobalRedecl5;<br>
 int functionScope() {<br>
-  extern int GlobalRedecl4; // still dllimport<br>
-  return GlobalRedecl4;<br>
+  extern int GlobalRedecl5; // still dllimport<br>
+  return GlobalRedecl5;<br>
 }<br>
<br>
<br>
@@ -99,3 +106,9 @@ USE(redecl2)<br>
 __declspec(dllimport) void redecl3(void);<br>
                       void redecl3(void) {} // dllimport ignored<br>
 USE(redecl3)<br>
+<br>
+// Make sure this works even if the decl is used before it's defined (PR20792).<br>
+// CHECK-DAG: define void @redecl4()<br>
+__declspec(dllimport) void redecl4(void);<br>
+USE(redecl4)<br>
+                      void redecl4(void) {} // dllimport ignored<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>