diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 6e8440a17738..5c12c81b36be 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -298,7 +298,7 @@ void CodeGenModule::SetFunctionDefinitionAttributes(const FunctionDecl *D, GV->setLinkage(llvm::Function::InternalLinkage); } else if (D->hasAttr()) { GV->setLinkage(llvm::Function::DLLExportLinkage); - } else if (D->hasAttr() || D->hasAttr()) { + } else if (D->hasAttr()) { GV->setLinkage(llvm::Function::WeakAnyLinkage); } else if (Linkage == GVA_C99Inline) { // In C99 mode, 'inline' functions are guaranteed to have a strong @@ -853,7 +853,7 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) { GV->setLinkage(llvm::Function::DLLImportLinkage); else if (D->hasAttr()) GV->setLinkage(llvm::Function::DLLExportLinkage); - else if (D->hasAttr() || D->hasAttr()) + else if (D->hasAttr()) GV->setLinkage(llvm::GlobalVariable::WeakAnyLinkage); else if (!CompileOpts.NoCommon && (!D->hasExternalStorage() && !D->getInit())) diff --git a/clang/test/CodeGen/attributes.c b/clang/test/CodeGen/attributes.c index d45d5124b010..a5de4f4b42a2 100644 --- a/clang/test/CodeGen/attributes.c +++ b/clang/test/CodeGen/attributes.c @@ -14,7 +14,7 @@ // RUN: grep '@t13 =.*section "SECT"' %t && // RUN: grep '@t14.x =.*section "SECT"' %t // RUN: grep 'declare extern_weak i32 @t15()' %t && -// RUN: grep '@t16 = extern_weak global i32' %t +// RUN: grep '@t16 = extern_weak global i32' %t && void t1() __attribute__((noreturn)); void t1() {} @@ -56,4 +56,14 @@ int t17() { return t15() + t16; } +// RUN: grep '@t18 = global i[0-9]* 1, align .*' %t && +extern int t18 __attribute__((weak_import)); +int t18 = 1; +// RUN: grep 'define i[0-9]* @t19() nounwind {' %t && +extern int t19(void) __attribute__((weak_import)); +int t19(void) { + return 10; +} + +// RUN: true