|  | // REQUIRES: x86 | 
|  | // RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t | 
|  | // RUN: ld.lld %t -o %tout | 
|  | // RUN: llvm-readobj -S -l --symbols %tout | FileCheck %s | 
|  | // RUN: llvm-objdump -d %tout | FileCheck %s --check-prefix=DIS | 
|  |  | 
|  | /// Reject local-exec TLS relocations for -shared, regardless of the preemptibility. | 
|  | // RUN: not ld.lld -shared %t -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR | 
|  | // RUN: not ld.lld -shared -Bsymbolic %t -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR | 
|  |  | 
|  | // ERR:       error: relocation R_X86_64_TPOFF32 against a cannot be used with -shared | 
|  | // ERR-NEXT:  defined in {{.*}} | 
|  | // ERR-NEXT:  referenced by {{.*}}:(.text+0x4) | 
|  | // ERR-EMPTY: | 
|  | // ERR-NEXT:  error: relocation R_X86_64_TPOFF32 against b cannot be used with -shared | 
|  | // ERR-NEXT:  defined in {{.*}} | 
|  | // ERR-NEXT:  referenced by {{.*}}:(.text+0xC) | 
|  | // ERR-EMPTY: | 
|  | // ERR-NEXT:  error: relocation R_X86_64_TPOFF32 against c cannot be used with -shared | 
|  | // ERR-NEXT:  defined in {{.*}} | 
|  | // ERR-NEXT:  referenced by {{.*}}:(.text+0x14) | 
|  | // ERR-EMPTY: | 
|  | // ERR-NEXT:  error: relocation R_X86_64_TPOFF32 against d cannot be used with -shared | 
|  | // ERR-NEXT:  defined in {{.*}} | 
|  | // ERR-NEXT:  referenced by {{.*}}:(.text+0x1C) | 
|  |  | 
|  | .global _start | 
|  | _start: | 
|  | movl %fs:a@tpoff, %eax | 
|  | movl %fs:b@tpoff, %eax | 
|  | movl %fs:c@tpoff, %eax | 
|  | movl %fs:d@tpoff, %eax | 
|  |  | 
|  | .global a | 
|  | .section	.tbss,"awT",@nobits | 
|  | a: | 
|  | .long	0 | 
|  |  | 
|  | .global b | 
|  | .section	.tdata,"awT",@progbits | 
|  | b: | 
|  | .long	1 | 
|  |  | 
|  | .global c | 
|  | .section	.thread_bss,"awT",@nobits | 
|  | c: | 
|  | .long	0 | 
|  |  | 
|  | .global d | 
|  | .section	.thread_data,"awT",@progbits | 
|  | d: | 
|  | .long	2 | 
|  |  | 
|  | // CHECK:          Name: .tdata | 
|  | // CHECK-NEXT:     Type: SHT_PROGBITS | 
|  | // CHECK-NEXT:     Flags [ | 
|  | // CHECK-NEXT:       SHF_ALLOC | 
|  | // CHECK-NEXT:       SHF_TLS | 
|  | // CHECK-NEXT:       SHF_WRITE | 
|  | // CHECK-NEXT:     ] | 
|  | // CHECK-NEXT:     Address: [[TDATA_ADDR:0x.*]] | 
|  | // CHECK-NEXT:     Offset: | 
|  | // CHECK-NEXT:     Size: 4 | 
|  | // CHECK-NEXT:     Link: | 
|  | // CHECK-NEXT:     Info: | 
|  | // CHECK-NEXT:     AddressAlignment: | 
|  | // CHECK-NEXT:     EntrySize: | 
|  | // CHECK-NEXT:   } | 
|  | // CHECK-NEXT:   Section { | 
|  | // CHECK-NEXT:     Index: | 
|  | // CHECK-NEXT:     Name: .thread_data | 
|  | // CHECK-NEXT:     Type: SHT_PROGBITS | 
|  | // CHECK-NEXT:     Flags [ | 
|  | // CHECK-NEXT:       SHF_ALLOC | 
|  | // CHECK-NEXT:       SHF_TLS | 
|  | // CHECK-NEXT:       SHF_WRITE | 
|  | // CHECK-NEXT:     ] | 
|  | // CHECK-NEXT:     Address: | 
|  | // CHECK-NEXT:     Offset: | 
|  | // CHECK-NEXT:     Size: 4 | 
|  | // CHECK-NEXT:     Link: | 
|  | // CHECK-NEXT:     Info: | 
|  | // CHECK-NEXT:     AddressAlignment: | 
|  | // CHECK-NEXT:     EntrySize: | 
|  | // CHECK-NEXT:   } | 
|  | // CHECK-NEXT:   Section { | 
|  | // CHECK-NEXT:     Index: | 
|  | // CHECK-NEXT:     Name: .tbss | 
|  | // CHECK-NEXT:     Type: SHT_NOBITS | 
|  | // CHECK-NEXT:     Flags [ | 
|  | // CHECK-NEXT:       SHF_ALLOC | 
|  | // CHECK-NEXT:       SHF_TLS | 
|  | // CHECK-NEXT:       SHF_WRITE | 
|  | // CHECK-NEXT:     ] | 
|  | // CHECK-NEXT:     Address: [[TBSS_ADDR:0x.*]] | 
|  | // CHECK-NEXT:     Offset: | 
|  | // CHECK-NEXT:     Size: 4 | 
|  | // CHECK-NEXT:     Link: | 
|  | // CHECK-NEXT:     Info: | 
|  | // CHECK-NEXT:     AddressAlignment: | 
|  | // CHECK-NEXT:     EntrySize: | 
|  | // CHECK-NEXT:   } | 
|  | // CHECK-NEXT:   Section { | 
|  | // CHECK-NEXT:     Index: | 
|  | // CHECK-NEXT:     Name: .thread_bss | 
|  | // CHECK-NEXT:     Type: SHT_NOBITS | 
|  | // CHECK-NEXT:     Flags [ | 
|  | // CHECK-NEXT:       SHF_ALLOC | 
|  | // CHECK-NEXT:       SHF_TLS | 
|  | // CHECK-NEXT:       SHF_WRITE | 
|  | // CHECK-NEXT:     ] | 
|  |  | 
|  | // 0x2021F4 = TBSS_ADDR + 4 | 
|  |  | 
|  | // CHECK-NEXT:     Address: 0x2021F4 | 
|  | // CHECK-NEXT:     Offset: | 
|  | // CHECK-NEXT:     Size: 4 | 
|  | // CHECK-NEXT:     Link: | 
|  | // CHECK-NEXT:     Info: | 
|  | // CHECK-NEXT:     AddressAlignment: | 
|  | // CHECK-NEXT:     EntrySize: | 
|  | // CHECK-NEXT:   } | 
|  |  | 
|  | // Check that the TLS NOBITS sections weren't added to the R/W PT_LOAD's size. | 
|  |  | 
|  | // CHECK:      ProgramHeaders [ | 
|  | // CHECK:          Type: PT_LOAD | 
|  | // CHECK:          Type: PT_LOAD | 
|  | // CHECK:          Type: PT_LOAD | 
|  | // CHECK:          FileSize: 8 | 
|  | // CHECK-NEXT:     MemSize: 8 | 
|  | // CHECK-NEXT:     Flags [ | 
|  | // CHECK-NEXT:       PF_R | 
|  | // CHECK-NEXT:       PF_W | 
|  | // CHECK-NEXT:     ] | 
|  | // CHECK:          Type: PT_TLS | 
|  | // CHECK-NEXT:     Offset: | 
|  | // CHECK-NEXT:     VirtualAddress: [[TDATA_ADDR]] | 
|  | // CHECK-NEXT:     PhysicalAddress: [[TDATA_ADDR]] | 
|  | // CHECK-NEXT:     FileSize: 8 | 
|  | // CHECK-NEXT:     MemSize: 16 | 
|  | // CHECK-NEXT:     Flags [ | 
|  | // CHECK-NEXT:       PF_R | 
|  | // CHECK-NEXT:     ] | 
|  | // CHECK-NEXT:     Alignment: | 
|  | // CHECK-NEXT:   } | 
|  |  | 
|  | // CHECK:      Symbols [ | 
|  | // CHECK:          Name: a | 
|  | // CHECK-NEXT:     Value: 0x8 | 
|  | // CHECK-NEXT:     Size: | 
|  | // CHECK-NEXT:     Binding: Global | 
|  | // CHECK-NEXT:     Type: TLS | 
|  | // CHECK-NEXT:     Other: 0 | 
|  | // CHECK-NEXT:     Section: .tbss | 
|  | // CHECK-NEXT:   } | 
|  | // CHECK-NEXT:   Symbol { | 
|  | // CHECK-NEXT:     Name: b | 
|  | // CHECK-NEXT:     Value: 0x0 | 
|  | // CHECK-NEXT:     Size: | 
|  | // CHECK-NEXT:     Binding: Global | 
|  | // CHECK-NEXT:     Type: TLS | 
|  | // CHECK-NEXT:     Other: 0 | 
|  | // CHECK-NEXT:     Section: .tdata | 
|  | // CHECK-NEXT:   } | 
|  | // CHECK-NEXT:   Symbol { | 
|  | // CHECK-NEXT:     Name: c | 
|  | // CHECK-NEXT:     Value: 0xC | 
|  | // CHECK-NEXT:     Size: | 
|  | // CHECK-NEXT:     Binding: Global | 
|  | // CHECK-NEXT:     Type: TLS | 
|  | // CHECK-NEXT:     Other: 0 | 
|  | // CHECK-NEXT:     Section: .thread_bss | 
|  | // CHECK-NEXT:   } | 
|  | // CHECK-NEXT:   Symbol { | 
|  | // CHECK-NEXT:     Name: d | 
|  | // CHECK-NEXT:     Value: 0x4 | 
|  | // CHECK-NEXT:     Size: | 
|  | // CHECK-NEXT:     Binding: Global | 
|  | // CHECK-NEXT:     Type: TLS | 
|  | // CHECK-NEXT:     Other: 0 | 
|  | // CHECK-NEXT:     Section: .thread_data | 
|  | // CHECK-NEXT:   } | 
|  |  | 
|  | // DIS:      Disassembly of section .text: | 
|  | // DIS-EMPTY: | 
|  | // DIS-NEXT: <_start>: | 
|  | // DIS-NEXT:   movl    %fs:-8, %eax | 
|  | // DIS-NEXT:   movl    %fs:-16, %eax | 
|  | // DIS-NEXT:   movl    %fs:-4, %eax | 
|  | // DIS-NEXT:   movl    %fs:-12, %eax |