Re: r369705 - [Clang][CodeGen] set alias linkage on QualType

2019-09-09 Thread Hans Wennborg via cfe-commits
Merged to release_90 in r371372 (along with the follow-up test fix).

On Thu, Aug 22, 2019 at 10:45 PM Nick Desaulniers via cfe-commits
 wrote:
>
> Author: nickdesaulniers
> Date: Thu Aug 22 13:47:12 2019
> New Revision: 369705
>
> URL: http://llvm.org/viewvc/llvm-project?rev=369705=rev
> Log:
> [Clang][CodeGen] set alias linkage on QualType
>
> Summary:
> It seems that CodeGen was always using ExternalLinkage when emitting a
> GlobalDecl with __attribute__((alias)). This leads to symbol
> redefinitions (ODR) that cause failures at link time for static aliases.
> This is readily attempting to link an ARM (32b) allyesconfig Linux
> kernel built with Clang.
>
> Reported-by: nathanchance
> Suggested-by: ihalip
> Link: https://bugs.llvm.org/show_bug.cgi?id=42377
> Link: https://github.com/ClangBuiltLinux/linux/issues/631
>
> Reviewers: rsmith, aaron.ballman, erichkeane
>
> Reviewed By: aaron.ballman
>
> Subscribers: javed.absar, kristof.beyls, cfe-commits, srhines, ihalip, 
> nathanchance
>
> Tags: #clang
>
> Differential Revision: https://reviews.llvm.org/D66492
>
> Modified:
> cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> cfe/trunk/test/CodeGen/alias.c
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=369705=369704=369705=diff
> ==
> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Thu Aug 22 13:47:12 2019
> @@ -4363,17 +4363,22 @@ void CodeGenModule::EmitAliasDefinition(
>// Create a reference to the named value.  This ensures that it is emitted
>// if a deferred decl.
>llvm::Constant *Aliasee;
> -  if (isa(DeclTy))
> +  llvm::GlobalValue::LinkageTypes LT;
> +  if (isa(DeclTy)) {
>  Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
>/*ForVTable=*/false);
> -  else
> +LT = getFunctionLinkage(GD);
> +  } else {
>  Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(),
>  llvm::PointerType::getUnqual(DeclTy),
>  /*D=*/nullptr);
> +LT = getLLVMLinkageVarDefinition(cast(GD.getDecl()),
> + D->getType().isConstQualified());
> +  }
>
>// Create the new alias itself, but don't set a name yet.
> -  auto *GA = llvm::GlobalAlias::create(
> -  DeclTy, 0, llvm::Function::ExternalLinkage, "", Aliasee, ());
> +  auto *GA =
> +  llvm::GlobalAlias::create(DeclTy, 0, LT, "", Aliasee, ());
>
>if (Entry) {
>  if (GA->getAliasee() == Entry) {
>
> Modified: cfe/trunk/test/CodeGen/alias.c
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/alias.c?rev=369705=369704=369705=diff
> ==
> --- cfe/trunk/test/CodeGen/alias.c (original)
> +++ cfe/trunk/test/CodeGen/alias.c Thu Aug 22 13:47:12 2019
> @@ -2,6 +2,7 @@
>  // RUN: %clang_cc1 -triple i386-pc-linux-gnu -emit-llvm -o - %s | FileCheck 
> -check-prefix=CHECKBASIC %s
>  // RUN: %clang_cc1 -triple armv7a-eabi -mfloat-abi hard -emit-llvm -o - %s | 
> FileCheck -check-prefix=CHECKCC %s
>  // RUN: %clang_cc1 -triple armv7a-eabi -mfloat-abi hard -S -o - %s | 
> FileCheck -check-prefix=CHECKASM %s
> +// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck -check-prefix=CHECKGLOBALS 
> %s
>
>  int g0;
>  // CHECKBASIC-DAG: @g0 = common global i32 0
> @@ -88,3 +89,13 @@ void test8_zed() __attribute__((alias("t
>  void test9_bar(void) { }
>  void test9_zed(void) __attribute__((section("test")));
>  void test9_zed(void) __attribute__((alias("test9_bar")));
> +
> +// Test that the alias gets its linkage from its declared qual type.
> +// CHECKGLOBALS: @test10_foo = internal
> +// CHECKGLOBALS-NOT: @test10_foo = dso_local
> +int test10;
> +static int test10_foo __attribute__((alias("test10")));
> +// CHECKGLOBALS: @test11_foo = internal
> +// CHECKGLOBALS-NOT: @test11_foo = dso_local
> +void test11(void) {}
> +static void test11_foo(void) __attribute__((alias("test11")));
>
>
> ___
> cfe-commits mailing list
> cfe-commits@lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


Re: r369705 - [Clang][CodeGen] set alias linkage on QualType

2019-08-22 Thread Nick Desaulniers via cfe-commits
Thanks for the report, would you mind reviewing:
https://reviews.llvm.org/D66622?

On Thu, Aug 22, 2019 at 2:44 PM Erik Pilkington
 wrote:
>
> This commit is causing test failures on darwin:
>
> http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-incremental/1464/consoleFull#-18314650158254eaf0-7326-4999-85b0-388101f2d404
>
> Looks like you need to add a triple to the RUN line you added. Can you fix 
> this?
>
> Thanks!
> Erik
>
> On Aug 22, 2019, at 1:47 PM, Nick Desaulniers via cfe-commits 
>  wrote:
>
> Author: nickdesaulniers
> Date: Thu Aug 22 13:47:12 2019
> New Revision: 369705
>
> URL: http://llvm.org/viewvc/llvm-project?rev=369705=rev
> Log:
> [Clang][CodeGen] set alias linkage on QualType
>
> Summary:
> It seems that CodeGen was always using ExternalLinkage when emitting a
> GlobalDecl with __attribute__((alias)). This leads to symbol
> redefinitions (ODR) that cause failures at link time for static aliases.
> This is readily attempting to link an ARM (32b) allyesconfig Linux
> kernel built with Clang.
>
> Reported-by: nathanchance
> Suggested-by: ihalip
> Link: https://bugs.llvm.org/show_bug.cgi?id=42377
> Link: https://github.com/ClangBuiltLinux/linux/issues/631
>
> Reviewers: rsmith, aaron.ballman, erichkeane
>
> Reviewed By: aaron.ballman
>
> Subscribers: javed.absar, kristof.beyls, cfe-commits, srhines, ihalip, 
> nathanchance
>
> Tags: #clang
>
> Differential Revision: https://reviews.llvm.org/D66492
>
> Modified:
>cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>cfe/trunk/test/CodeGen/alias.c
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=369705=369704=369705=diff
> ==
> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Thu Aug 22 13:47:12 2019
> @@ -4363,17 +4363,22 @@ void CodeGenModule::EmitAliasDefinition(
>   // Create a reference to the named value.  This ensures that it is emitted
>   // if a deferred decl.
>   llvm::Constant *Aliasee;
> -  if (isa(DeclTy))
> +  llvm::GlobalValue::LinkageTypes LT;
> +  if (isa(DeclTy)) {
> Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
>   /*ForVTable=*/false);
> -  else
> +LT = getFunctionLinkage(GD);
> +  } else {
> Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(),
> llvm::PointerType::getUnqual(DeclTy),
> /*D=*/nullptr);
> +LT = getLLVMLinkageVarDefinition(cast(GD.getDecl()),
> + D->getType().isConstQualified());
> +  }
>
>   // Create the new alias itself, but don't set a name yet.
> -  auto *GA = llvm::GlobalAlias::create(
> -  DeclTy, 0, llvm::Function::ExternalLinkage, "", Aliasee, ());
> +  auto *GA =
> +  llvm::GlobalAlias::create(DeclTy, 0, LT, "", Aliasee, ());
>
>   if (Entry) {
> if (GA->getAliasee() == Entry) {
>
> Modified: cfe/trunk/test/CodeGen/alias.c
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/alias.c?rev=369705=369704=369705=diff
> ==
> --- cfe/trunk/test/CodeGen/alias.c (original)
> +++ cfe/trunk/test/CodeGen/alias.c Thu Aug 22 13:47:12 2019
> @@ -2,6 +2,7 @@
> // RUN: %clang_cc1 -triple i386-pc-linux-gnu -emit-llvm -o - %s | FileCheck 
> -check-prefix=CHECKBASIC %s
> // RUN: %clang_cc1 -triple armv7a-eabi -mfloat-abi hard -emit-llvm -o - %s | 
> FileCheck -check-prefix=CHECKCC %s
> // RUN: %clang_cc1 -triple armv7a-eabi -mfloat-abi hard -S -o - %s | 
> FileCheck -check-prefix=CHECKASM %s
> +// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck -check-prefix=CHECKGLOBALS 
> %s
>
> int g0;
> // CHECKBASIC-DAG: @g0 = common global i32 0
> @@ -88,3 +89,13 @@ void test8_zed() __attribute__((alias("t
> void test9_bar(void) { }
> void test9_zed(void) __attribute__((section("test")));
> void test9_zed(void) __attribute__((alias("test9_bar")));
> +
> +// Test that the alias gets its linkage from its declared qual type.
> +// CHECKGLOBALS: @test10_foo = internal
> +// CHECKGLOBALS-NOT: @test10_foo = dso_local
> +int test10;
> +static int test10_foo __attribute__((alias("test10")));
> +// CHECKGLOBALS: @test11_foo = internal
> +// CHECKGLOBALS-NOT: @test11_foo = dso_local
> +void test11(void) {}
> +static void test11_foo(void) __attribute__((alias("test11")));
>
>
> ___
> cfe-commits mailing list
> cfe-commits@lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>


-- 
Thanks,
~Nick Desaulniers
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


Re: r369705 - [Clang][CodeGen] set alias linkage on QualType

2019-08-22 Thread Erik Pilkington via cfe-commits
This commit is causing test failures on darwin:

http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-incremental/1464/consoleFull#-18314650158254eaf0-7326-4999-85b0-388101f2d404
 


Looks like you need to add a triple to the RUN line you added. Can you fix this?

Thanks!
Erik

> On Aug 22, 2019, at 1:47 PM, Nick Desaulniers via cfe-commits 
>  wrote:
> 
> Author: nickdesaulniers
> Date: Thu Aug 22 13:47:12 2019
> New Revision: 369705
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=369705=rev
> Log:
> [Clang][CodeGen] set alias linkage on QualType
> 
> Summary:
> It seems that CodeGen was always using ExternalLinkage when emitting a
> GlobalDecl with __attribute__((alias)). This leads to symbol
> redefinitions (ODR) that cause failures at link time for static aliases.
> This is readily attempting to link an ARM (32b) allyesconfig Linux
> kernel built with Clang.
> 
> Reported-by: nathanchance
> Suggested-by: ihalip
> Link: https://bugs.llvm.org/show_bug.cgi?id=42377
> Link: https://github.com/ClangBuiltLinux/linux/issues/631
> 
> Reviewers: rsmith, aaron.ballman, erichkeane
> 
> Reviewed By: aaron.ballman
> 
> Subscribers: javed.absar, kristof.beyls, cfe-commits, srhines, ihalip, 
> nathanchance
> 
> Tags: #clang
> 
> Differential Revision: https://reviews.llvm.org/D66492
> 
> Modified:
>cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>cfe/trunk/test/CodeGen/alias.c
> 
> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=369705=369704=369705=diff
> ==
> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Thu Aug 22 13:47:12 2019
> @@ -4363,17 +4363,22 @@ void CodeGenModule::EmitAliasDefinition(
>   // Create a reference to the named value.  This ensures that it is emitted
>   // if a deferred decl.
>   llvm::Constant *Aliasee;
> -  if (isa(DeclTy))
> +  llvm::GlobalValue::LinkageTypes LT;
> +  if (isa(DeclTy)) {
> Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
>   /*ForVTable=*/false);
> -  else
> +LT = getFunctionLinkage(GD);
> +  } else {
> Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(),
> llvm::PointerType::getUnqual(DeclTy),
> /*D=*/nullptr);
> +LT = getLLVMLinkageVarDefinition(cast(GD.getDecl()),
> + D->getType().isConstQualified());
> +  }
> 
>   // Create the new alias itself, but don't set a name yet.
> -  auto *GA = llvm::GlobalAlias::create(
> -  DeclTy, 0, llvm::Function::ExternalLinkage, "", Aliasee, ());
> +  auto *GA =
> +  llvm::GlobalAlias::create(DeclTy, 0, LT, "", Aliasee, ());
> 
>   if (Entry) {
> if (GA->getAliasee() == Entry) {
> 
> Modified: cfe/trunk/test/CodeGen/alias.c
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/alias.c?rev=369705=369704=369705=diff
> ==
> --- cfe/trunk/test/CodeGen/alias.c (original)
> +++ cfe/trunk/test/CodeGen/alias.c Thu Aug 22 13:47:12 2019
> @@ -2,6 +2,7 @@
> // RUN: %clang_cc1 -triple i386-pc-linux-gnu -emit-llvm -o - %s | FileCheck 
> -check-prefix=CHECKBASIC %s
> // RUN: %clang_cc1 -triple armv7a-eabi -mfloat-abi hard -emit-llvm -o - %s | 
> FileCheck -check-prefix=CHECKCC %s
> // RUN: %clang_cc1 -triple armv7a-eabi -mfloat-abi hard -S -o - %s | 
> FileCheck -check-prefix=CHECKASM %s
> +// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck -check-prefix=CHECKGLOBALS 
> %s
> 
> int g0;
> // CHECKBASIC-DAG: @g0 = common global i32 0
> @@ -88,3 +89,13 @@ void test8_zed() __attribute__((alias("t
> void test9_bar(void) { }
> void test9_zed(void) __attribute__((section("test")));
> void test9_zed(void) __attribute__((alias("test9_bar")));
> +
> +// Test that the alias gets its linkage from its declared qual type.
> +// CHECKGLOBALS: @test10_foo = internal
> +// CHECKGLOBALS-NOT: @test10_foo = dso_local
> +int test10;
> +static int test10_foo __attribute__((alias("test10")));
> +// CHECKGLOBALS: @test11_foo = internal
> +// CHECKGLOBALS-NOT: @test11_foo = dso_local
> +void test11(void) {}
> +static void test11_foo(void) __attribute__((alias("test11")));
> 
> 
> ___
> cfe-commits mailing list
> cfe-commits@lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r369705 - [Clang][CodeGen] set alias linkage on QualType

2019-08-22 Thread Nick Desaulniers via cfe-commits
Author: nickdesaulniers
Date: Thu Aug 22 13:47:12 2019
New Revision: 369705

URL: http://llvm.org/viewvc/llvm-project?rev=369705=rev
Log:
[Clang][CodeGen] set alias linkage on QualType

Summary:
It seems that CodeGen was always using ExternalLinkage when emitting a
GlobalDecl with __attribute__((alias)). This leads to symbol
redefinitions (ODR) that cause failures at link time for static aliases.
This is readily attempting to link an ARM (32b) allyesconfig Linux
kernel built with Clang.

Reported-by: nathanchance
Suggested-by: ihalip
Link: https://bugs.llvm.org/show_bug.cgi?id=42377
Link: https://github.com/ClangBuiltLinux/linux/issues/631

Reviewers: rsmith, aaron.ballman, erichkeane

Reviewed By: aaron.ballman

Subscribers: javed.absar, kristof.beyls, cfe-commits, srhines, ihalip, 
nathanchance

Tags: #clang

Differential Revision: https://reviews.llvm.org/D66492

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

Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=369705=369704=369705=diff
==
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Thu Aug 22 13:47:12 2019
@@ -4363,17 +4363,22 @@ void CodeGenModule::EmitAliasDefinition(
   // Create a reference to the named value.  This ensures that it is emitted
   // if a deferred decl.
   llvm::Constant *Aliasee;
-  if (isa(DeclTy))
+  llvm::GlobalValue::LinkageTypes LT;
+  if (isa(DeclTy)) {
 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
   /*ForVTable=*/false);
-  else
+LT = getFunctionLinkage(GD);
+  } else {
 Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(),
 llvm::PointerType::getUnqual(DeclTy),
 /*D=*/nullptr);
+LT = getLLVMLinkageVarDefinition(cast(GD.getDecl()),
+ D->getType().isConstQualified());
+  }
 
   // Create the new alias itself, but don't set a name yet.
-  auto *GA = llvm::GlobalAlias::create(
-  DeclTy, 0, llvm::Function::ExternalLinkage, "", Aliasee, ());
+  auto *GA =
+  llvm::GlobalAlias::create(DeclTy, 0, LT, "", Aliasee, ());
 
   if (Entry) {
 if (GA->getAliasee() == Entry) {

Modified: cfe/trunk/test/CodeGen/alias.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/alias.c?rev=369705=369704=369705=diff
==
--- cfe/trunk/test/CodeGen/alias.c (original)
+++ cfe/trunk/test/CodeGen/alias.c Thu Aug 22 13:47:12 2019
@@ -2,6 +2,7 @@
 // RUN: %clang_cc1 -triple i386-pc-linux-gnu -emit-llvm -o - %s | FileCheck 
-check-prefix=CHECKBASIC %s
 // RUN: %clang_cc1 -triple armv7a-eabi -mfloat-abi hard -emit-llvm -o - %s | 
FileCheck -check-prefix=CHECKCC %s
 // RUN: %clang_cc1 -triple armv7a-eabi -mfloat-abi hard -S -o - %s | FileCheck 
-check-prefix=CHECKASM %s
+// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck -check-prefix=CHECKGLOBALS %s
 
 int g0;
 // CHECKBASIC-DAG: @g0 = common global i32 0
@@ -88,3 +89,13 @@ void test8_zed() __attribute__((alias("t
 void test9_bar(void) { }
 void test9_zed(void) __attribute__((section("test")));
 void test9_zed(void) __attribute__((alias("test9_bar")));
+
+// Test that the alias gets its linkage from its declared qual type.
+// CHECKGLOBALS: @test10_foo = internal
+// CHECKGLOBALS-NOT: @test10_foo = dso_local
+int test10;
+static int test10_foo __attribute__((alias("test10")));
+// CHECKGLOBALS: @test11_foo = internal
+// CHECKGLOBALS-NOT: @test11_foo = dso_local
+void test11(void) {}
+static void test11_foo(void) __attribute__((alias("test11")));


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits