Fixes https://bugs.llvm.org/show_bug.cgi?id=46473 LLD wasn't previously specifying any specific alignment in the TLS table's Characteristics field so the loader would just assume the default value (16 bytes). This works most of the time except if you have thread locals that want specific higher alignments (e.g. 32 as in the bug) *even* if they specify an alignment on the thread local. This change updates LLD to take the max alignment from tls section. Reviewed By: rnk Differential Revision: https://reviews.llvm.org/D88637
27 lines
899 B
LLVM
27 lines
899 B
LLVM
; REQUIRES: x86
|
|
|
|
; This test is to make sure that the necessary alignment for thread locals
|
|
; gets reflected in the TLS Directory of the generated executable on x86-64.
|
|
;
|
|
; aligned_thread_local specifies 'align 64' and so the generated
|
|
; exe should reflect that with a value of IMAGE_SCN_ALIGN_64BYTES
|
|
; in the Characteristics field of the IMAGE_TLS_DIRECTORY
|
|
|
|
; RUN: llc -filetype=obj %S/Inputs/tlssup-64.ll -o %t.tlssup.obj
|
|
; RUN: llc -filetype=obj %s -o %t.obj
|
|
; RUN: lld-link %t.tlssup.obj %t.obj -entry:main -nodefaultlib -out:%t.exe
|
|
; RUN: llvm-readobj --coff-tls-directory %t.exe | FileCheck %s
|
|
|
|
; CHECK: TLSDirectory {
|
|
; CHECK: Characteristics [ (0x700000)
|
|
; CHECK-NEXT: IMAGE_SCN_ALIGN_64BYTES (0x700000)
|
|
|
|
target triple = "x86_64-pc-windows-msvc"
|
|
|
|
@aligned_thread_local = thread_local global i32 42, align 64
|
|
|
|
define i32 @main() {
|
|
%t = load i32, i32* @aligned_thread_local
|
|
ret i32 %t
|
|
}
|