aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ELF/LTO.cpp2
-rw-r--r--test/ELF/lto/tls-preserve.ll25
2 files changed, 26 insertions, 1 deletions
diff --git a/ELF/LTO.cpp b/ELF/LTO.cpp
index 1539d05dd..dc087bb44 100644
--- a/ELF/LTO.cpp
+++ b/ELF/LTO.cpp
@@ -147,7 +147,7 @@ BitcodeCompiler::BitcodeCompiler()
Mover(*Combined) {}
static void undefine(Symbol *S) {
- replaceBody<Undefined>(S, S->body()->getName(), STV_DEFAULT, 0);
+ replaceBody<Undefined>(S, S->body()->getName(), STV_DEFAULT, S->body()->Type);
}
void BitcodeCompiler::add(BitcodeFile &F) {
diff --git a/test/ELF/lto/tls-preserve.ll b/test/ELF/lto/tls-preserve.ll
new file mode 100644
index 000000000..8aebcb783
--- /dev/null
+++ b/test/ELF/lto/tls-preserve.ll
@@ -0,0 +1,25 @@
+; TLS attribute needs to be preserved.
+; REQUIRES: x86
+; RUN: llvm-as %s -o %t1.o
+; RUN: ld.lld -shared %t1.o -m elf_x86_64 -o %t1
+; RUN: llvm-readobj -t %t1 | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+@tsp_int = thread_local global i32 1
+
+define void @_start() {
+ %val = load i32, i32* @tsp_int
+ ret void
+}
+
+; CHECK: Symbol {
+; CHECK: Name: tsp_int
+; CHECK-NEXT: Value: 0x0
+; CHECK-NEXT: Size: 4
+; CHECK-NEXT: Binding: Global
+; CHECK-NEXT: Type: TLS
+; CHECK-NEXT: Other: 0
+; CHECK-NEXT: Section: .tdata
+; CHECK-NEXT: }