Index: lib/CodeGen/AsmPrinter/AsmPrinter.cpp =================================================================== --- lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -396,7 +396,8 @@ OutStreamer->EmitSymbolAttribute(GVSym, MCSA_WeakDefinition); else OutStreamer->EmitSymbolAttribute(GVSym, MCSA_WeakDefAutoPrivate); - } else if (MAI->hasLinkOnceDirective()) { + } else if (MAI->hasLinkOnceDirective() && + GlobalValue::isLinkOnceLinkage(Linkage)) { // .globl _foo OutStreamer->EmitSymbolAttribute(GVSym, MCSA_Global); //NOTE: linkonce is handled by the section the symbol was assigned to. Index: test/CodeGen/X86/coff-weak.ll =================================================================== --- test/CodeGen/X86/coff-weak.ll +++ test/CodeGen/X86/coff-weak.ll @@ -1,9 +1,26 @@ -; RUN: llc -function-sections -o - %s | FileCheck %s +; RUN: llc -mtriple=i686-windows-msvc -o - %s | FileCheck -check-prefix=X86 %s +; RUN: llc -mtriple=x86_64-windows-msvc -o - %s | FileCheck -check-prefix=X64 %s -target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-pc-windows-msvc" +; X86: .weak _foo +; X64: .weak foo +define weak void @foo() { + ret void +} + +; X86: .weak _bar +; X64: .weak bar +define weak_odr void @bar() { + ret void +} + +; X86-NOT: .weak _baz +; X64-NOT: .weak baz +define linkonce void @baz() { + ret void +} -; CHECK: .section{{.*}}one_only -define linkonce_odr void @foo() { +; X86-NOT: .weak _quux +; X64-NOT: .weak quux +define linkonce_odr void @quux() { ret void } Index: test/CodeGen/X86/dllexport-x86_64.ll =================================================================== --- test/CodeGen/X86/dllexport-x86_64.ll +++ test/CodeGen/X86/dllexport-x86_64.ll @@ -29,7 +29,7 @@ ret void } -; CHECK: .globl weak1 +; CHECK: .weak weak1 define weak_odr dllexport void @weak1() { ret void } @@ -46,14 +46,14 @@ ; CHECK: .comm Var3 @Var3 = common dllexport global i32 0, align 4 -; CHECK: .globl WeakVar1 +; CHECK: .weak WeakVar1 @WeakVar1 = weak_odr dllexport global i32 1, align 4 -; CHECK: .globl WeakVar2 +; CHECK: .weak WeakVar2 @WeakVar2 = weak_odr dllexport unnamed_addr constant i32 1 ; CHECK: .bss -; CHECK: .globl WeakVar3 +; CHECK: .weak WeakVar3 @WeakVar3 = weak_odr dllexport global i32 0, align 4 Index: test/CodeGen/X86/dllexport.ll =================================================================== --- test/CodeGen/X86/dllexport.ll +++ test/CodeGen/X86/dllexport.ll @@ -54,7 +54,7 @@ ret void } -; CHECK: .globl _weak1 +; CHECK: .weak _weak1 define weak_odr dllexport void @weak1() { ret void } @@ -71,10 +71,10 @@ ; CHECK: .comm _Var3 @Var3 = common dllexport global i32 0, align 4 -; CHECK: .globl _WeakVar1 +; CHECK: .weak _WeakVar1 @WeakVar1 = weak_odr dllexport global i32 1, align 4 -; CHECK: .globl _WeakVar2 +; CHECK: .weak _WeakVar2 @WeakVar2 = weak_odr dllexport unnamed_addr constant i32 1