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 <cfe-commits@lists.llvm.org> wrote: > > Author: nickdesaulniers > Date: Thu Aug 22 13:47:12 2019 > New Revision: 369705 > > URL: http://llvm.org/viewvc/llvm-project?rev=369705&view=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&r1=369704&r2=369705&view=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<llvm::FunctionType>(DeclTy)) > + llvm::GlobalValue::LinkageTypes LT; > + if (isa<llvm::FunctionType>(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<VarDecl>(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, &getModule()); > + auto *GA = > + llvm::GlobalAlias::create(DeclTy, 0, LT, "", Aliasee, &getModule()); > > 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&r1=369704&r2=369705&view=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