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

Nico Weber thakis at chromium.org
Thu Aug 28 19:41:10 PDT 2014


On Thu, Aug 28, 2014 at 5:16 PM, Hans Wennborg <hans at hanshq.net> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140828/b8c2045e/attachment.html>


More information about the cfe-commits mailing list