diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 3881270cc5dc8..ec0eb497bfa86 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -460,7 +460,7 @@ MCSymbol *AsmPrinter::getSymbolPreferLocal(const GlobalValue &GV) const { // assumed it. if (TM.getTargetTriple().isOSBinFormatELF() && GlobalObject::isExternalLinkage(GV.getLinkage()) && GV.isDSOLocal() && - !GV.isDeclaration() && isa(GV)) + !GV.isDeclaration() && !isa(GV)) return getSymbolWithGlobalValueBase(&GV, "$local"); return TM.getSymbol(&GV); } @@ -1383,6 +1383,9 @@ void AsmPrinter::emitGlobalIndirectSymbol(Module &M, // Emit the directives as assignments aka .set: OutStreamer->EmitAssignment(Name, Expr); + MCSymbol *LocalAlias = getSymbolPreferLocal(GIS); + if (LocalAlias != Name) + OutStreamer->EmitAssignment(LocalAlias, Expr); if (auto *GA = dyn_cast(&GIS)) { // If the aliasee does not correspond to a symbol in the output, i.e. the diff --git a/llvm/test/CodeGen/X86/2008-03-12-ThreadLocalAlias.ll b/llvm/test/CodeGen/X86/2008-03-12-ThreadLocalAlias.ll index 2ca003e052aa6..89d249c091786 100644 --- a/llvm/test/CodeGen/X86/2008-03-12-ThreadLocalAlias.ll +++ b/llvm/test/CodeGen/X86/2008-03-12-ThreadLocalAlias.ll @@ -12,7 +12,7 @@ target triple = "i386-pc-linux-gnu" define i32 @foo() { ; CHECK-LABEL: foo: -; CHECK: leal __libc_resp@TLSLD +; CHECK: leal .L__libc_resp$local@TLSLDM entry: %retval = alloca i32 ; [#uses=1] %"alloca point" = bitcast i32 0 to i32 ; [#uses=0] @@ -27,7 +27,7 @@ return: ; preds = %entry define i32 @bar() { ; CHECK-LABEL: bar: -; CHECK: leal __libc_resp@TLSLD +; CHECK: leal .L__libc_resp$local@TLSLDM entry: %retval = alloca i32 ; [#uses=1] %"alloca point" = bitcast i32 0 to i32 ; [#uses=0] diff --git a/llvm/test/CodeGen/X86/linux-preemption.ll b/llvm/test/CodeGen/X86/linux-preemption.ll index 3bf97112a840b..e876469f8fa6b 100644 --- a/llvm/test/CodeGen/X86/linux-preemption.ll +++ b/llvm/test/CodeGen/X86/linux-preemption.ll @@ -108,9 +108,9 @@ define i32* @get_weak_default_alias() { define i32* @get_strong_local_alias() { ret i32* @strong_local_alias } -; CHECK: leaq strong_local_alias(%rip), %rax -; STATIC: movl $strong_local_alias, %eax -; CHECK32: leal strong_local_alias@GOTOFF(%eax), %eax +; CHECK: leaq .Lstrong_local_alias$local(%rip), %rax +; STATIC: movl $.Lstrong_local_alias$local, %eax +; CHECK32: leal .Lstrong_local_alias$local@GOTOFF(%eax), %eax @weak_local_alias = weak dso_local alias i32, i32* @aliasee define i32* @get_weak_local_alias() { @@ -235,6 +235,7 @@ define void()* @get_external_preemptable_function() { ; COMMON-NEXT: .set weak_default_alias, aliasee ; COMMON-NEXT: .globl strong_local_alias ; COMMON-NEXT: .set strong_local_alias, aliasee +; COMMON-NEXT: .set .Lstrong_local_alias$local, aliasee ; COMMON-NEXT: .weak weak_local_alias ; COMMON-NEXT: .set weak_local_alias, aliasee ; COMMON-NEXT: .globl strong_preemptable_alias