On Thu, Aug 28, 2014 at 5:16 PM, Hans Wennborg <[email protected]> wrote:
> 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, Is there a test case for this case? > 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 > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
