diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 8 | ||||
-rw-r--r-- | clang/test/CodeGen/dllimport.c | 21 |
2 files changed, 25 insertions, 4 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 1f0dd73e65b..aaadbd4633c 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -1449,6 +1449,10 @@ CodeGenModule::GetOrCreateLLVMFunction(StringRef MangledName, 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(StringRef MangledName, 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; diff --git a/clang/test/CodeGen/dllimport.c b/clang/test/CodeGen/dllimport.c index 6ed60ea1e25..0f592d00f53 100644 --- a/clang/test/CodeGen/dllimport.c +++ b/clang/test/CodeGen/dllimport.c @@ -44,12 +44,19 @@ __declspec(dllimport) extern int GlobalRedecl3; 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 |