Index: ELF/Relocations.cpp =================================================================== --- ELF/Relocations.cpp +++ ELF/Relocations.cpp @@ -204,6 +204,9 @@ if (Config->EMachine == EM_MIPS) return handleMipsTlsRelocation(Type, Body, C, Offset, Addend, Expr); + if (Target->isTlsInitialExecRel(Type) || Target->isTlsLocalExecRel(Type)) + Target->StaticTlsModel = true; + bool IsPreemptible = isPreemptible(Body, Type); if (isRelExprOneOf(Expr) && Config->Shared) { Index: ELF/SyntheticSections.cpp =================================================================== --- ELF/SyntheticSections.cpp +++ ELF/SyntheticSections.cpp @@ -1031,6 +1031,15 @@ if (!Config->SoName.empty()) add({DT_SONAME, In::DynStrTab->addString(Config->SoName)}); + if (!Config->Shared && !Config->Relocatable) + add({DT_DEBUG, (uint64_t)0}); +} + +// Add remaining entries to complete .dynamic contents. +template void DynamicSection::finalizeContents() { + if (this->Size) + return; // Already finalized. + // Set DT_FLAGS and DT_FLAGS_1. uint32_t DtFlags = 0; uint32_t DtFlags1 = 0; @@ -1048,21 +1057,14 @@ DtFlags |= DF_ORIGIN; DtFlags1 |= DF_1_ORIGIN; } + if (Target->StaticTlsModel) + DtFlags |= DF_STATIC_TLS; if (DtFlags) add({DT_FLAGS, DtFlags}); if (DtFlags1) add({DT_FLAGS_1, DtFlags1}); - if (!Config->Shared && !Config->Relocatable) - add({DT_DEBUG, (uint64_t)0}); -} - -// Add remaining entries to complete .dynamic contents. -template void DynamicSection::finalizeContents() { - if (this->Size) - return; // Already finalized. - this->Link = In::DynStrTab->OutSec->SectionIndex; if (In::RelaDyn->OutSec->Size > 0) { bool IsRela = Config->IsRela; Index: ELF/Target.h =================================================================== --- ELF/Target.h +++ ELF/Target.h @@ -25,6 +25,7 @@ public: virtual bool isTlsInitialExecRel(uint32_t Type) const; virtual bool isTlsLocalDynamicRel(uint32_t Type) const; + virtual bool isTlsLocalExecRel(uint32_t Type) const; virtual bool isPicRel(uint32_t Type) const { return true; } virtual uint32_t getDynRel(uint32_t Type) const { return Type; } virtual void writeGotPltHeader(uint8_t *Buf) const {} @@ -89,6 +90,9 @@ // Set to 0 for variant 2 unsigned TcbSize = 0; + // Indicates that output contains code that use static TLS model. + bool StaticTlsModel = false; + bool NeedsThunks = false; // A 4-byte field corresponding to one or more trap instructions, used to pad Index: ELF/Target.cpp =================================================================== --- ELF/Target.cpp +++ ELF/Target.cpp @@ -125,6 +125,7 @@ void writeGotPltHeader(uint8_t *Buf) const override; uint32_t getDynRel(uint32_t Type) const override; bool isTlsLocalDynamicRel(uint32_t Type) const override; + bool isTlsLocalExecRel(uint32_t Type) const override; bool isTlsInitialExecRel(uint32_t Type) const override; void writeGotPlt(uint8_t *Buf, const SymbolBody &S) const override; void writeIgotPlt(uint8_t *Buf, const SymbolBody &S) const override; @@ -310,6 +311,8 @@ bool TargetInfo::isTlsLocalDynamicRel(uint32_t Type) const { return false; } +bool TargetInfo::isTlsLocalExecRel(uint32_t Type) const { return false; } + void TargetInfo::writeIgotPlt(uint8_t *Buf, const SymbolBody &S) const { writeGotPlt(Buf, S); } @@ -458,6 +461,10 @@ return Type == R_386_TLS_LDO_32 || Type == R_386_TLS_LDM; } +bool X86TargetInfo::isTlsLocalExecRel(uint32_t Type) const { + return Type == R_386_TLS_LE_32 || Type == R_386_TLS_LE; +} + bool X86TargetInfo::isTlsInitialExecRel(uint32_t Type) const { return Type == R_386_TLS_IE || Type == R_386_TLS_GOTIE; } Index: test/ELF/Inputs/i386-static-tls-model1.s =================================================================== --- test/ELF/Inputs/i386-static-tls-model1.s +++ test/ELF/Inputs/i386-static-tls-model1.s @@ -0,0 +1,10 @@ +.section ".tdata", "awT", @progbits +.globl var +var: + +.section .foo, "aw" +.global _start +_start: + movl $var@tpoff, %edx # R_386_TLS_LE_32 + movl %gs:0, %ecx + subl %edx, %eax Index: test/ELF/Inputs/i386-static-tls-model2.s =================================================================== --- test/ELF/Inputs/i386-static-tls-model2.s +++ test/ELF/Inputs/i386-static-tls-model2.s @@ -0,0 +1,9 @@ +.section ".tdata", "awT", @progbits +.globl var +var: + +.section .foo, "aw" +.global _start +_start: + movl %gs:0, %eax + addl var@gotntpoff(%ebx),%eax # R_386_TLS_GOTIE Index: test/ELF/Inputs/i386-static-tls-model3.s =================================================================== --- test/ELF/Inputs/i386-static-tls-model3.s +++ test/ELF/Inputs/i386-static-tls-model3.s @@ -0,0 +1,9 @@ +.section ".tdata", "awT", @progbits +.globl var +var: + +.section .foo, "aw" +.global _start +_start: + movl %gs:0, %eax + addl var@indntpoff, %eax #R_386_TLS_IE Index: test/ELF/Inputs/i386-static-tls-model4.s =================================================================== --- test/ELF/Inputs/i386-static-tls-model4.s +++ test/ELF/Inputs/i386-static-tls-model4.s @@ -0,0 +1,9 @@ +.section ".tdata", "awT", @progbits +.globl var +var: + +.section .foo, "aw" +.global _start +_start: + movl %gs:0, %eax + leal var@ntpoff(%eax), %eax #R_386_TLS_LE Index: test/ELF/aarch64-tls-ie.s =================================================================== --- test/ELF/aarch64-tls-ie.s +++ test/ELF/aarch64-tls-ie.s @@ -15,8 +15,8 @@ #RELOC-NEXT: SHF_ALLOC #RELOC-NEXT: SHF_WRITE #RELOC-NEXT: ] -#RELOC-NEXT: Address: 0x300B0 -#RELOC-NEXT: Offset: 0x200B0 +#RELOC-NEXT: Address: 0x300C0 +#RELOC-NEXT: Offset: 0x200C0 #RELOC-NEXT: Size: 16 #RELOC-NEXT: Link: 0 #RELOC-NEXT: Info: 0 @@ -25,21 +25,21 @@ #RELOC-NEXT: } #RELOC: Relocations [ #RELOC-NEXT: Section ({{.*}}) .rela.dyn { -#RELOC-NEXT: 0x300B8 R_AARCH64_TLS_TPREL64 bar 0x0 -#RELOC-NEXT: 0x300B0 R_AARCH64_TLS_TPREL64 foo 0x0 +#RELOC-NEXT: 0x300C8 R_AARCH64_TLS_TPREL64 bar 0x0 +#RELOC-NEXT: 0x300C0 R_AARCH64_TLS_TPREL64 foo 0x0 #RELOC-NEXT: } #RELOC-NEXT:] -# Page(0x300B0) - Page(0x20000) = 0x10000 = 65536 -# 0x300B0 & 0xff8 = 0xB0 = 176 +# Page(0x300C0) - Page(0x20000) = 0x10000 = 65536 +# 0x300C0 & 0xff8 = 0xC0 = 192 # Page(0x300B8) - Page(0x20000) = 0x10000 = 65536 -# 0x300B8 & 0xff8 = 0xB8 = 184 +# 0x300C0 & 0xff8 = 0xC8 = 200 #CHECK: Disassembly of section .text: #CHECK: _start: #CHECK: 20000: 80 00 00 90 adrp x0, #65536 -#CHECK: 20004: 00 58 40 f9 ldr x0, [x0, #176] +#CHECK: 20004: 00 60 40 f9 ldr x0, [x0, #192] #CHECK: 20008: 80 00 00 90 adrp x0, #65536 -#CHECK: 2000c: 00 5c 40 f9 ldr x0, [x0, #184] +#CHECK: 2000c: 00 64 40 f9 ldr x0, [x0, #200] .globl _start _start: Index: test/ELF/i386-static-tls-model.s =================================================================== --- test/ELF/i386-static-tls-model.s +++ test/ELF/i386-static-tls-model.s @@ -0,0 +1,20 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -filetype=obj -triple=i686-pc-linux %S/Inputs/i386-static-tls-model1.s -o %t.o +# RUN: ld.lld %t.o -o %t1 -shared +# RUN: llvm-readobj -dynamic-table %t1 | FileCheck %s + +# RUN: llvm-mc -filetype=obj -triple=i686-pc-linux %S/Inputs/i386-static-tls-model2.s -o %t.o +# RUN: ld.lld %t.o -o %t2 -shared +# RUN: llvm-readobj -dynamic-table %t2 | FileCheck %s + +# RUN: llvm-mc -filetype=obj -triple=i686-pc-linux %S/Inputs/i386-static-tls-model3.s -o %t.o +# RUN: ld.lld %t.o -o %t3 -shared +# RUN: llvm-readobj -dynamic-table %t3 | FileCheck %s + +# RUN: llvm-mc -filetype=obj -triple=i686-pc-linux %S/Inputs/i386-static-tls-model4.s -o %t.o +# RUN: ld.lld %t.o -o %t4 -shared +# RUN: llvm-readobj -dynamic-table %t4 | FileCheck %s + +# CHECK: DynamicSection [ +# CHECK: FLAGS STATIC_TLS Index: test/ELF/i386-tls-ie-shared.s =================================================================== --- test/ELF/i386-tls-ie-shared.s +++ test/ELF/i386-tls-ie-shared.s @@ -13,8 +13,8 @@ // GOTRELSHARED-NEXT: SHF_ALLOC // GOTRELSHARED-NEXT: SHF_WRITE // GOTRELSHARED-NEXT: ] -// GOTRELSHARED-NEXT: Address: 0x1058 -// GOTRELSHARED-NEXT: Offset: 0x1058 +// GOTRELSHARED-NEXT: Address: 0x1060 +// GOTRELSHARED-NEXT: Offset: 0x1060 // GOTRELSHARED-NEXT: Size: 16 // GOTRELSHARED-NEXT: Link: 0 // GOTRELSHARED-NEXT: Info: 0 @@ -31,36 +31,36 @@ // GOTRELSHARED-NEXT: 0x202D R_386_RELATIVE - 0x0 // GOTRELSHARED-NEXT: 0x2036 R_386_RELATIVE - 0x0 // GOTRELSHARED-NEXT: 0x203F R_386_RELATIVE - 0x0 -// GOTRELSHARED-NEXT: 0x1058 R_386_TLS_TPOFF tlslocal0 0x0 -// GOTRELSHARED-NEXT: 0x105C R_386_TLS_TPOFF tlslocal1 0x0 -// GOTRELSHARED-NEXT: 0x1060 R_386_TLS_TPOFF tlsshared0 0x0 -// GOTRELSHARED-NEXT: 0x1064 R_386_TLS_TPOFF tlsshared1 0x0 +// GOTRELSHARED-NEXT: 0x1060 R_386_TLS_TPOFF tlslocal0 0x0 +// GOTRELSHARED-NEXT: 0x1064 R_386_TLS_TPOFF tlslocal1 0x0 +// GOTRELSHARED-NEXT: 0x1068 R_386_TLS_TPOFF tlsshared0 0x0 +// GOTRELSHARED-NEXT: 0x106C R_386_TLS_TPOFF tlsshared1 0x0 // GOTRELSHARED-NEXT: } // GOTRELSHARED-NEXT: ] // GOTRELSHARED: 0x6FFFFFFA RELCOUNT 8 // DISASMSHARED: Disassembly of section test: // DISASMSHARED-NEXT: _start: -// (.got)[0] = 0x2050 = 8272 -// (.got)[1] = 0x2054 = 8276 -// (.got)[2] = 0x2058 = 8280 -// (.got)[3] = 0x205C = 8284 -// DISASMSHARED-NEXT: 2000: 8b 0d 58 10 00 00 movl 4184, %ecx -// DISASMSHARED-NEXT: 2006: 65 8b 01 movl %gs:(%ecx), %eax -// DISASMSHARED-NEXT: 2009: a1 58 10 00 00 movl 4184, %eax -// DISASMSHARED-NEXT: 200e: 65 8b 00 movl %gs:(%eax), %eax -// DISASMSHARED-NEXT: 2011: 03 0d 58 10 00 00 addl 4184, %ecx -// DISASMSHARED-NEXT: 2017: 65 8b 01 movl %gs:(%ecx), %eax -// DISASMSHARED-NEXT: 201a: 8b 0d 5c 10 00 00 movl 4188, %ecx -// DISASMSHARED-NEXT: 2020: 65 8b 01 movl %gs:(%ecx), %eax -// DISASMSHARED-NEXT: 2023: a1 5c 10 00 00 movl 4188, %eax -// DISASMSHARED-NEXT: 2028: 65 8b 00 movl %gs:(%eax), %eax -// DISASMSHARED-NEXT: 202b: 03 0d 5c 10 00 00 addl 4188, %ecx -// DISASMSHARED-NEXT: 2031: 65 8b 01 movl %gs:(%ecx), %eax -// DISASMSHARED-NEXT: 2034: 8b 0d 60 10 00 00 movl 4192, %ecx -// DISASMSHARED-NEXT: 203a: 65 8b 01 movl %gs:(%ecx), %eax -// DISASMSHARED-NEXT: 203d: 03 0d 64 10 00 00 addl 4196, %ecx -// DISASMSHARED-NEXT: 2043: 65 8b 01 movl %gs:(%ecx), %eax +// (.got)[0] = 0x1060 = 4192 +// (.got)[1] = 0x1064 = 4196 +// (.got)[2] = 0x1068 = 4200 +// (.got)[3] = 0x106C = 4204 +// DISASMSHARED-NEXT: 2000: {{.*}} movl 4192, %ecx +// DISASMSHARED-NEXT: 2006: {{.*}} movl %gs:(%ecx), %eax +// DISASMSHARED-NEXT: 2009: {{.*}} movl 4192, %eax +// DISASMSHARED-NEXT: 200e: {{.*}} movl %gs:(%eax), %eax +// DISASMSHARED-NEXT: 2011: {{.*}} addl 4192, %ecx +// DISASMSHARED-NEXT: 2017: {{.*}} movl %gs:(%ecx), %eax +// DISASMSHARED-NEXT: 201a: {{.*}} movl 4196, %ecx +// DISASMSHARED-NEXT: 2020: {{.*}} movl %gs:(%ecx), %eax +// DISASMSHARED-NEXT: 2023: {{.*}} movl 4196, %eax +// DISASMSHARED-NEXT: 2028: {{.*}} movl %gs:(%eax), %eax +// DISASMSHARED-NEXT: 202b: {{.*}} addl 4196, %ecx +// DISASMSHARED-NEXT: 2031: {{.*}} movl %gs:(%ecx), %eax +// DISASMSHARED-NEXT: 2034: {{.*}} movl 4200, %ecx +// DISASMSHARED-NEXT: 203a: {{.*}} movl %gs:(%ecx), %eax +// DISASMSHARED-NEXT: 203d: {{.*}} addl 4204, %ecx +// DISASMSHARED-NEXT: 2043: {{.*}} movl %gs:(%ecx), %eax .type tlslocal0,@object .section .tbss,"awT",@nobits Index: test/ELF/tls-dynamic-i686.s =================================================================== --- test/ELF/tls-dynamic-i686.s +++ test/ELF/tls-dynamic-i686.s @@ -56,8 +56,8 @@ // CHECK-NEXT: SHF_ALLOC // CHECK-NEXT: SHF_WRITE // CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x3068 -// CHECK-NEXT: Offset: 0x3068 +// CHECK-NEXT: Address: 0x3070 +// CHECK-NEXT: Offset: 0x3070 // CHECK-NEXT: Size: 32 // CHECK-NEXT: Link: 0 // CHECK-NEXT: Info: 0 @@ -66,13 +66,13 @@ // CHECK: Relocations [ // CHECK: Section ({{.+}}) .rel.dyn { -// CHECK-NEXT: 0x3078 R_386_TLS_DTPMOD32 - 0x0 -// CHECK-NEXT: 0x3068 R_386_TLS_DTPMOD32 tls0 0x0 -// CHECK-NEXT: 0x306C R_386_TLS_DTPOFF32 tls0 0x0 -// CHECK-NEXT: 0x3080 R_386_TLS_TPOFF tls0 0x0 -// CHECK-NEXT: 0x3070 R_386_TLS_DTPMOD32 tls1 0x0 -// CHECK-NEXT: 0x3074 R_386_TLS_DTPOFF32 tls1 0x0 -// CHECK-NEXT: 0x3084 R_386_TLS_TPOFF tls1 0x0 +// CHECK-NEXT: 0x3080 R_386_TLS_DTPMOD32 - 0x0 +// CHECK-NEXT: 0x3070 R_386_TLS_DTPMOD32 tls0 0x0 +// CHECK-NEXT: 0x3074 R_386_TLS_DTPOFF32 tls0 0x0 +// CHECK-NEXT: 0x3088 R_386_TLS_TPOFF tls0 0x0 +// CHECK-NEXT: 0x3078 R_386_TLS_DTPMOD32 tls1 0x0 +// CHECK-NEXT: 0x307C R_386_TLS_DTPOFF32 tls1 0x0 +// CHECK-NEXT: 0x308C R_386_TLS_TPOFF tls1 0x0 // CHECK-NEXT: } // DIS: Disassembly of section .text: @@ -80,20 +80,20 @@ // General dynamic model: // -32 and -24 are first and second GOT entries offsets. // Each one is a pair of records. -// DIS-NEXT: 1000: 8d 04 1d e0 ff ff ff leal -32(,%ebx), %eax -// DIS-NEXT: 1007: e8 64 00 00 00 calll 100 -// DIS-NEXT: 100c: 8d 04 1d e8 ff ff ff leal -24(,%ebx), %eax -// DIS-NEXT: 1013: e8 58 00 00 00 calll 88 +// DIS-NEXT: 1000: {{.*}} leal -32(,%ebx), %eax +// DIS-NEXT: 1007: {{.*}} calll 100 +// DIS-NEXT: 100c: {{.*}} leal -24(,%ebx), %eax +// DIS-NEXT: 1013: {{.*}} calll 88 // Local dynamic model: // -16 is a local module tls index offset. -// DIS-NEXT: 1018: 8d 83 f0 ff ff ff leal -16(%ebx), %eax -// DIS-NEXT: 101e: e8 4d 00 00 00 calll 77 -// DIS-NEXT: 1023: 8d 90 08 00 00 00 leal 8(%eax), %edx -// DIS-NEXT: 1029: 8d 83 f0 ff ff ff leal -16(%ebx), %eax -// DIS-NEXT: 102f: e8 3c 00 00 00 calll 60 -// DIS-NEXT: 1034: 8d 90 08 00 00 00 leal 8(%eax), %edx +// DIS-NEXT: 1018: {{.*}} leal -16(%ebx), %eax +// DIS-NEXT: 101e: {{.*}} calll 77 +// DIS-NEXT: 1023: {{.*}} leal 8(%eax), %edx +// DIS-NEXT: 1029: {{.*}} leal -16(%ebx), %eax +// DIS-NEXT: 102f: {{.*}} calll 60 +// DIS-NEXT: 1034: {{.*}} leal 8(%eax), %edx // Initial exec model: -// DIS-NEXT: 103a: 65 a1 00 00 00 00 movl %gs:0, %eax -// DIS-NEXT: 1040: 03 83 f8 ff ff ff addl -8(%ebx), %eax -// DIS-NEXT: 1046: 65 a1 00 00 00 00 movl %gs:0, %eax -// DIS-NEXT: 104c: 03 83 fc ff ff ff addl -4(%ebx), %eax +// DIS-NEXT: 103a: {{.*}} movl %gs:0, %eax +// DIS-NEXT: 1040: {{.*}} addl -8(%ebx), %eax +// DIS-NEXT: 1046: {{.*}} movl %gs:0, %eax +// DIS-NEXT: 104c: {{.*}} addl -4(%ebx), %eax Index: test/ELF/tls-dynamic.s =================================================================== --- test/ELF/tls-dynamic.s +++ test/ELF/tls-dynamic.s @@ -48,28 +48,28 @@ // CHECK-NEXT: SHF_ALLOC // CHECK-NEXT: SHF_WRITE // CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x30D0 +// CHECK-NEXT: Address: 0x30E0 // CHECK-NEXT: Offset: // CHECK-NEXT: Size: 40 // CHECK: Relocations [ // CHECK: Section ({{.+}}) .rela.dyn { -// CHECK-NEXT: 0x30D0 R_X86_64_DTPMOD64 - 0x0 -// CHECK-NEXT: 0x30E0 R_X86_64_DTPMOD64 c 0x0 -// CHECK-NEXT: 0x30E8 R_X86_64_DTPOFF64 c 0x0 -// CHECK-NEXT: 0x30F0 R_X86_64_TPOFF64 c 0x0 +// CHECK-NEXT: 0x30E0 R_X86_64_DTPMOD64 - 0x0 +// CHECK-NEXT: 0x30F0 R_X86_64_DTPMOD64 c 0x0 +// CHECK-NEXT: 0x30F8 R_X86_64_DTPOFF64 c 0x0 +// CHECK-NEXT: 0x3100 R_X86_64_TPOFF64 c 0x0 // CHECK-NEXT: } -// 4297 = (0x20D0 + -4) - (0x1000 + 3) // PC relative offset to got entry. -// 4285 = (0x20D0 + -4) - (0x100c + 3) // PC relative offset to got entry. -// 4267 = (0x20E0 + -4) - (0x102e + 3) // PC relative offset to got entry. -// 4263 = (0x20F0 + -4) - (0x1042 + 3) // PC relative offset to got entry. +// 8409 = (0x30E0 + -4) - (0x1000 + 3) // PC relative offset to got entry. +// 8397 = (0x30F0 + -4) - (0x100c + 3) // PC relative offset to got entry. +// 8379 = (0x30F8 + -4) - (0x102e + 3) // PC relative offset to got entry. +// 8375 = (0x3100 + -4) - (0x1042 + 3) // PC relative offset to got entry. // DIS: Disassembly of section .text: // DIS-NEXT: .text: -// DIS-NEXT: 1000: {{.+}} leaq 8393(%rip), %rdi +// DIS-NEXT: 1000: {{.+}} leaq 8409(%rip), %rdi // DIS-NEXT: 1007: {{.+}} callq -// DIS-NEXT: 100c: {{.+}} leaq 8381(%rip), %rdi +// DIS-NEXT: 100c: {{.+}} leaq 8397(%rip), %rdi // DIS-NEXT: 1013: {{.+}} callq // DIS-NEXT: 1018: {{.+}} leaq (%rax), %rcx // DIS-NEXT: 101f: {{.+}} leaq 4(%rax), %rcx @@ -77,10 +77,10 @@ // DIS-NEXT: 1028: 00 00 // DIS-NEXT: 102a: 00 00 // DIS-NEXT: 102c: 00 00 -// DIS-NEXT: 102e: {{.+}} leaq 8363(%rip), %rdi +// DIS-NEXT: 102e: {{.+}} leaq 8379(%rip), %rdi // DIS-NEXT: 1035: {{.+}} callq // DIS-NEXT: 103b: {{.+}} leaq (%rax), %rcx -// DIS-NEXT: 1042: {{.+}} movq 8359(%rip), %rax +// DIS-NEXT: 1042: {{.+}} movq 8375(%rip), %rax // DIS-NEXT: 1049: {{.+}} movq %fs:(%rax), %rax // DIS-NEXT: 104d: {{.+}} movabsq $0, %rax // DIS-NEXT: 1057: {{.+}} movabsq $4, %rax Index: test/ELF/tls-got.s =================================================================== --- test/ELF/tls-got.s +++ test/ELF/tls-got.s @@ -14,7 +14,7 @@ // CHECK-NEXT: SHF_WRITE // CHECK-NEXT: ] // CHECK-NEXT: Address: [[ADDR:.*]] -// CHECK-NEXT: Offset: 0x20B0 +// CHECK-NEXT: Offset: 0x20C0 // CHECK-NEXT: Size: 16 // CHECK-NEXT: Link: 0 // CHECK-NEXT: Info: 0 @@ -24,22 +24,22 @@ // CHECK: Relocations [ // CHECK-NEXT: Section (4) .rela.dyn { -// CHECK-NEXT: 0x2020B8 R_X86_64_TPOFF64 tls0 0x0 +// CHECK-NEXT: 0x2020C8 R_X86_64_TPOFF64 tls0 0x0 // CHECK-NEXT: [[ADDR]] R_X86_64_TPOFF64 tls1 0x0 // CHECK-NEXT: } // CHECK-NEXT: ] -//0x201000 + 4249 + 7 = 0x2020B0 -//0x20100A + 4247 + 7 = 0x2020B8 -//0x201014 + 4237 + 7 = 0x2020B8 +//0x201000 + 4281 + 7 = 0x2020C0 +//0x20100A + 4279 + 7 = 0x2020C8 +//0x201014 + 4269 + 7 = 0x2020C8 //DISASM: Disassembly of section .text: //DISASM-NEXT: main: -//DISASM-NEXT: 201000: 48 8b 05 a9 10 00 00 movq 4265(%rip), %rax -//DISASM-NEXT: 201007: 64 8b 00 movl %fs:(%rax), %eax -//DISASM-NEXT: 20100a: 48 8b 05 a7 10 00 00 movq 4263(%rip), %rax -//DISASM-NEXT: 201011: 64 8b 00 movl %fs:(%rax), %eax -//DISASM-NEXT: 201014: 48 8b 05 9d 10 00 00 movq 4253(%rip), %rax -//DISASM-NEXT: 20101b: 64 8b 00 movl %fs:(%rax), %eax +//DISASM-NEXT: 201000: {{.*}} movq 4281(%rip), %rax +//DISASM-NEXT: 201007: {{.*}} movl %fs:(%rax), %eax +//DISASM-NEXT: 20100a: {{.*}} movq 4279(%rip), %rax +//DISASM-NEXT: 201011: {{.*}} movl %fs:(%rax), %eax +//DISASM-NEXT: 201014: {{.*}} movq 4269(%rip), %rax +//DISASM-NEXT: 20101b: {{.*}} movl %fs:(%rax), %eax //DISASM-NEXT: 20101e: c3 retq .section .tdata,"awT",@progbits Index: test/ELF/tls-initial-exec-local.s =================================================================== --- test/ELF/tls-initial-exec-local.s +++ test/ELF/tls-initial-exec-local.s @@ -10,21 +10,21 @@ // CHECK-NEXT: SHF_ALLOC (0x2) // CHECK-NEXT: SHF_WRITE (0x1) // CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x2090 +// CHECK-NEXT: Address: 0x20A0 // CHECK: Relocations [ // CHECK-NEXT: Section ({{.*}}) .rela.dyn { -// CHECK-NEXT: 0x2090 R_X86_64_TPOFF64 - 0x0 -// CHECK-NEXT: 0x2098 R_X86_64_TPOFF64 - 0x4 +// CHECK-NEXT: 0x20A0 R_X86_64_TPOFF64 - 0x0 +// CHECK-NEXT: 0x20A8 R_X86_64_TPOFF64 - 0x4 // CHECK-NEXT: } // CHECK-NEXT: ] -// 0x1007 + 4233 = 0x2090 -// 0x100e + 4234 = 0x2098 +// 0x1007 + 4249 = 0x20A0 +// 0x100e + 4250 = 0x20A8 // DISASM: Disassembly of section .text: // DISASM-NEXT: .text: -// DISASM-NEXT: 1000: {{.*}} addq 4233(%rip), %rax -// DISASM-NEXT: 1007: {{.*}} addq 4234(%rip), %rax +// DISASM-NEXT: 1000: {{.*}} addq 4249(%rip), %rax +// DISASM-NEXT: 1007: {{.*}} addq 4250(%rip), %rax addq foo@GOTTPOFF(%rip), %rax addq bar@GOTTPOFF(%rip), %rax Index: test/ELF/tls-opt-iele-i686-nopic.s =================================================================== --- test/ELF/tls-opt-iele-i686-nopic.s +++ test/ELF/tls-opt-iele-i686-nopic.s @@ -13,8 +13,8 @@ // GOTREL-NEXT: SHF_ALLOC // GOTREL-NEXT: SHF_WRITE // GOTREL-NEXT: ] -// GOTREL-NEXT: Address: 0x12058 -// GOTREL-NEXT: Offset: 0x2058 +// GOTREL-NEXT: Address: 0x12060 +// GOTREL-NEXT: Offset: 0x2060 // GOTREL-NEXT: Size: 8 // GOTREL-NEXT: Link: 0 // GOTREL-NEXT: Info: 0 @@ -23,8 +23,8 @@ // GOTREL-NEXT: } // GOTREL: Relocations [ // GOTREL-NEXT: Section ({{.*}}) .rel.dyn { -// GOTREL-NEXT: 0x12058 R_386_TLS_TPOFF tlsshared0 0x0 -// GOTREL-NEXT: 0x1205C R_386_TLS_TPOFF tlsshared1 0x0 +// GOTREL-NEXT: 0x12060 R_386_TLS_TPOFF tlsshared0 0x0 +// GOTREL-NEXT: 0x12064 R_386_TLS_TPOFF tlsshared1 0x0 // GOTREL-NEXT: } // GOTREL-NEXT: ] @@ -32,24 +32,24 @@ // DISASM-NEXT: _start: // 4294967288 = 0xFFFFFFF8 // 4294967292 = 0xFFFFFFFC -// 73808 = (.got)[0] = 0x12058 -// 73812 = (.got)[1] = 0x1205C -// DISASM-NEXT: 11000: c7 c1 f8 ff ff ff movl $4294967288, %ecx -// DISASM-NEXT: 11006: 65 8b 01 movl %gs:(%ecx), %eax -// DISASM-NEXT: 11009: b8 f8 ff ff ff movl $4294967288, %eax -// DISASM-NEXT: 1100e: 65 8b 00 movl %gs:(%eax), %eax -// DISASM-NEXT: 11011: 81 c1 f8 ff ff ff addl $4294967288, %ecx -// DISASM-NEXT: 11017: 65 8b 01 movl %gs:(%ecx), %eax -// DISASM-NEXT: 1101a: c7 c1 fc ff ff ff movl $4294967292, %ecx -// DISASM-NEXT: 11020: 65 8b 01 movl %gs:(%ecx), %eax -// DISASM-NEXT: 11023: b8 fc ff ff ff movl $4294967292, %eax -// DISASM-NEXT: 11028: 65 8b 00 movl %gs:(%eax), %eax -// DISASM-NEXT: 1102b: 81 c1 fc ff ff ff addl $4294967292, %ecx -// DISASM-NEXT: 11031: 65 8b 01 movl %gs:(%ecx), %eax -// DISASM-NEXT: 11034: 8b 0d 58 20 01 00 movl 73816, %ecx -// DISASM-NEXT: 1103a: 65 8b 01 movl %gs:(%ecx), %eax -// DISASM-NEXT: 1103d: 03 0d 5c 20 01 00 addl 73820, %ecx -// DISASM-NEXT: 11043: 65 8b 01 movl %gs:(%ecx), %eax +// 73824 = (.got)[0] = 0x12060 +// 73828 = (.got)[1] = 0x12064 +// DISASM-NEXT: 11000: {{.*}} movl $4294967288, %ecx +// DISASM-NEXT: 11006: {{.*}} movl %gs:(%ecx), %eax +// DISASM-NEXT: 11009: {{.*}} movl $4294967288, %eax +// DISASM-NEXT: 1100e: {{.*}} movl %gs:(%eax), %eax +// DISASM-NEXT: 11011: {{.*}} addl $4294967288, %ecx +// DISASM-NEXT: 11017: {{.*}} movl %gs:(%ecx), %eax +// DISASM-NEXT: 1101a: {{.*}} movl $4294967292, %ecx +// DISASM-NEXT: 11020: {{.*}} movl %gs:(%ecx), %eax +// DISASM-NEXT: 11023: {{.*}} movl $4294967292, %eax +// DISASM-NEXT: 11028: {{.*}} movl %gs:(%eax), %eax +// DISASM-NEXT: 1102b: {{.*}} addl $4294967292, %ecx +// DISASM-NEXT: 11031: {{.*}} movl %gs:(%ecx), %eax +// DISASM-NEXT: 11034: {{.*}} movl 73824, %ecx +// DISASM-NEXT: 1103a: {{.*}} movl %gs:(%ecx), %eax +// DISASM-NEXT: 1103d: {{.*}} addl 73828, %ecx +// DISASM-NEXT: 11043: {{.*}} movl %gs:(%ecx), %eax .type tlslocal0,@object .section .tbss,"awT",@nobits