r216699 - Better codegen support for DLL attributes being dropped after the first declaration (PR20792)

Hans Wennborg hans at hanshq.net
Thu Aug 28 17:16:06 PDT 2014


Author: hans
Date: Thu Aug 28 19:16:06 2014
New Revision: 216699

URL: http://llvm.org/viewvc/llvm-project?rev=216699&view=rev
Log:
Better codegen support for DLL attributes being dropped after the first declaration (PR20792)

For the following code:

  __declspec(dllimport) int f(int x);
  int user(int x) {
    return f(x);
  }
  int f(int x) { return 1; }

Clang will drop the dllimport attribute in the AST, but CodeGen would have
already put it on the LLVM::Function, and that would never get updated.
(The same thing happens for global variables.)

This makes Clang check dropped DLL attribute case each time the LLVM object
is referenced.

This isn't perfect, because we will still get it wrong if the function is
never referenced by codegen after the attribute is dropped, but this handles
the common cases and makes us not fail in the verifier.

Modified:
    cfe/trunk/lib/CodeGen/CodeGenModule.cpp
    cfe/trunk/test/CodeGen/dllimport.c

Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=216699&r1=216698&r2=216699&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Thu Aug 28 19:16:06 2014
@@ -1449,6 +1449,10 @@ CodeGenModule::GetOrCreateLLVMFunction(S
         Entry->setLinkage(llvm::Function::ExternalLinkage);
     }
 
+    // Handle dropped DLL attributes.
+    if (D && !D->hasAttr<DLLImportAttr>() && !D->hasAttr<DLLExportAttr>())
+      Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
+
     if (Entry->getType()->getElementType() == Ty)
       return Entry;
 
@@ -1614,6 +1618,10 @@ CodeGenModule::GetOrCreateLLVMGlobal(Str
         Entry->setLinkage(llvm::Function::ExternalLinkage);
     }
 
+    // Handle dropped DLL attributes.
+    if (D && !D->hasAttr<DLLImportAttr>() && !D->hasAttr<DLLExportAttr>())
+      Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
+
     if (Entry->getType() == Ty)
       return Entry;
 

Modified: cfe/trunk/test/CodeGen/dllimport.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/dllimport.c?rev=216699&r1=216698&r2=216699&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/dllimport.c (original)
+++ cfe/trunk/test/CodeGen/dllimport.c Thu Aug 28 19:16:06 2014
@@ -44,12 +44,19 @@ __declspec(dllimport) extern int GlobalR
                       extern int GlobalRedecl3; // dllimport ignored
 USEVAR(GlobalRedecl3)
 
+// Make sure this works even if the decl has been used before it's defined (PR20792).
+// CHECK: @GlobalRedecl4 = common global i32
+__declspec(dllimport) extern int GlobalRedecl4;
+USEVAR(GlobalRedecl4)
+                      int GlobalRedecl4; // dllimport ignored
+
+
 // Redeclaration in local context.
-// CHECK: @GlobalRedecl4 = external dllimport global i32
-__declspec(dllimport) int GlobalRedecl4;
+// CHECK: @GlobalRedecl5 = external dllimport global i32
+__declspec(dllimport) int GlobalRedecl5;
 int functionScope() {
-  extern int GlobalRedecl4; // still dllimport
-  return GlobalRedecl4;
+  extern int GlobalRedecl5; // still dllimport
+  return GlobalRedecl5;
 }
 
 
@@ -99,3 +106,9 @@ USE(redecl2)
 __declspec(dllimport) void redecl3(void);
                       void redecl3(void) {} // dllimport ignored
 USE(redecl3)
+
+// Make sure this works even if the decl is used before it's defined (PR20792).
+// CHECK-DAG: define void @redecl4()
+__declspec(dllimport) void redecl4(void);
+USE(redecl4)
+                      void redecl4(void) {} // dllimport ignored





More information about the cfe-commits mailing list