Index: cfe/trunk/lib/CodeGen/CodeGenModule.cpp =================================================================== --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp @@ -4363,17 +4363,22 @@ // 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, &getModule()); + auto *GA = + llvm::GlobalAlias::create(DeclTy, 0, LT, "", Aliasee, &getModule()); if (Entry) { if (GA->getAliasee() == Entry) { Index: cfe/trunk/test/CodeGen/alias.c =================================================================== --- cfe/trunk/test/CodeGen/alias.c +++ cfe/trunk/test/CodeGen/alias.c @@ -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 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")));