[PATCH] D43271: [Sparc] Include __tls_get_addr in symbol table for TLS calls to it
Jonas Devlieghere via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 21 07:28:44 PST 2018
This revision was automatically updated to reflect the committed changes.
Closed by commit rL325688: [Sparc] Include __tls_get_addr in symbol table for TLS calls to it (authored by JDevlieghere, committed by ).
Repository:
rL LLVM
https://reviews.llvm.org/D43271
Files:
llvm/trunk/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
llvm/trunk/test/CodeGen/SPARC/tls.ll
Index: llvm/trunk/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
===================================================================
--- llvm/trunk/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
+++ llvm/trunk/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
@@ -193,14 +193,26 @@
void SparcMCExpr::fixELFSymbolsInTLSFixups(MCAssembler &Asm) const {
switch(getKind()) {
default: return;
+ case VK_Sparc_TLS_GD_CALL:
+ case VK_Sparc_TLS_LDM_CALL: {
+ // The corresponding relocations reference __tls_get_addr, as they call it,
+ // but this is only implicit; we must explicitly add it to our symbol table
+ // to bind it for these uses.
+ MCSymbol *Symbol = Asm.getContext().getOrCreateSymbol("__tls_get_addr");
+ Asm.registerSymbol(*Symbol);
+ auto ELFSymbol = cast<MCSymbolELF>(Symbol);
+ if (!ELFSymbol->isBindingSet()) {
+ ELFSymbol->setBinding(ELF::STB_GLOBAL);
+ ELFSymbol->setExternal(true);
+ }
+ LLVM_FALLTHROUGH;
+ }
case VK_Sparc_TLS_GD_HI22:
case VK_Sparc_TLS_GD_LO10:
case VK_Sparc_TLS_GD_ADD:
- case VK_Sparc_TLS_GD_CALL:
case VK_Sparc_TLS_LDM_HI22:
case VK_Sparc_TLS_LDM_LO10:
case VK_Sparc_TLS_LDM_ADD:
- case VK_Sparc_TLS_LDM_CALL:
case VK_Sparc_TLS_LDO_HIX22:
case VK_Sparc_TLS_LDO_LOX10:
case VK_Sparc_TLS_LDO_ADD:
Index: llvm/trunk/test/CodeGen/SPARC/tls.ll
===================================================================
--- llvm/trunk/test/CodeGen/SPARC/tls.ll
+++ llvm/trunk/test/CodeGen/SPARC/tls.ll
@@ -3,10 +3,10 @@
; RUN: llc <%s -march=sparc -relocation-model=pic | FileCheck %s --check-prefix=pic
; RUN: llc <%s -march=sparcv9 -relocation-model=pic | FileCheck %s --check-prefix=pic
-; RUN: llc <%s -march=sparc -relocation-model=static -filetype=obj | llvm-readobj -r | FileCheck %s --check-prefix=v8abs-obj
-; RUN: llc <%s -march=sparcv9 -relocation-model=static -filetype=obj | llvm-readobj -r | FileCheck %s --check-prefix=v9abs-obj
-; RUN: llc <%s -march=sparc -relocation-model=pic -filetype=obj | llvm-readobj -r | FileCheck %s --check-prefix=pic-obj
-; RUN: llc <%s -march=sparcv9 -relocation-model=pic -filetype=obj | llvm-readobj -r | FileCheck %s --check-prefix=pic-obj
+; RUN: llc <%s -march=sparc -relocation-model=static -filetype=obj | llvm-readobj -r -t | FileCheck %s --check-prefix=v8abs-obj
+; RUN: llc <%s -march=sparcv9 -relocation-model=static -filetype=obj | llvm-readobj -r -t | FileCheck %s --check-prefix=v9abs-obj
+; RUN: llc <%s -march=sparc -relocation-model=pic -filetype=obj | llvm-readobj -r -t | FileCheck %s --check-prefix=pic-obj
+; RUN: llc <%s -march=sparcv9 -relocation-model=pic -filetype=obj | llvm-readobj -r -t | FileCheck %s --check-prefix=pic-obj
@local_symbol = internal thread_local global i32 0
@extern_symbol = external thread_local global i32
@@ -116,4 +116,15 @@
; pic-obj: 0x{{[0-9,A-F]+}} R_SPARC_TLS_GD_ADD extern_symbol 0x0
; pic-obj: 0x{{[0-9,A-F]+}} R_SPARC_TLS_GD_CALL extern_symbol 0x0
; pic-obj: ]
+; pic-obj: Symbols [
+; pic-obj: Symbol {
+; pic-obj: Name: __tls_get_addr ({{[0-9]+}})
+; pic-obj-NEXT: Value: 0x0
+; pic-obj-NEXT: Size: 0
+; pic-obj-NEXT: Binding: Global (0x1)
+; pic-obj-NEXT: Type: None (0x0)
+; pic-obj-NEXT: Other: 0
+; pic-obj-NEXT: Section: Undefined (0x0)
+; pic-obj-NEXT: }
+; pic-obj: ]
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D43271.135253.patch
Type: text/x-patch
Size: 3375 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180221/05181b45/attachment.bin>
More information about the llvm-commits
mailing list