[LLD] Add baseline test for TLS alignment. NFC.
Reviewed By: rnk Differential Revision: https://reviews.llvm.org/D88646
This commit is contained in:
		
							parent
							
								
									e379a68cd2
								
							
						
					
					
						commit
						6b7738e204
					
				| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
; We manually create these here if we're not linking against
 | 
			
		||||
; the CRT which would usually provide these.
 | 
			
		||||
 | 
			
		||||
target triple = "i686-pc-windows-msvc"
 | 
			
		||||
 | 
			
		||||
%IMAGE_TLS_DIRECTORY32 = type {
 | 
			
		||||
    i32,    ; StartAddressOfRawData
 | 
			
		||||
    i32,    ; EndAddressOfRawData
 | 
			
		||||
    i32,    ; AddressOfIndex
 | 
			
		||||
    i32,    ; AddressOfCallBacks
 | 
			
		||||
    i32,    ; SizeOfZeroFill
 | 
			
		||||
    i32     ; Characteristics
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@_tls_start = global i8 zeroinitializer, section ".tls"
 | 
			
		||||
@_tls_end = global i8 zeroinitializer, section ".tls$ZZZ"
 | 
			
		||||
@_tls_index = global i32 0
 | 
			
		||||
 | 
			
		||||
@_tls_used = global %IMAGE_TLS_DIRECTORY32 {
 | 
			
		||||
    i32 ptrtoint (i8* @_tls_start to i32),
 | 
			
		||||
    i32 ptrtoint (i8* @_tls_end to i32),
 | 
			
		||||
    i32 ptrtoint (i32* @_tls_index to i32),
 | 
			
		||||
    i32 0,
 | 
			
		||||
    i32 0,
 | 
			
		||||
    i32 0
 | 
			
		||||
}, section ".rdata$T"
 | 
			
		||||
 | 
			
		||||
; MSVC target uses a direct offset (0x58) for x86-64 but expects
 | 
			
		||||
; __tls_array to hold the offset (0x2C) on x86.
 | 
			
		||||
module asm ".global __tls_array"
 | 
			
		||||
module asm "__tls_array = 44"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,26 @@
 | 
			
		|||
; We manually create these here if we're not linking against
 | 
			
		||||
; the CRT which would usually provide these.
 | 
			
		||||
 | 
			
		||||
target triple = "x86_64-pc-windows-msvc"
 | 
			
		||||
 | 
			
		||||
%IMAGE_TLS_DIRECTORY64 = type {
 | 
			
		||||
    i64,    ; StartAddressOfRawData
 | 
			
		||||
    i64,    ; EndAddressOfRawData
 | 
			
		||||
    i64,    ; AddressOfIndex
 | 
			
		||||
    i64,    ; AddressOfCallBacks
 | 
			
		||||
    i32,    ; SizeOfZeroFill
 | 
			
		||||
    i32     ; Characteristics
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@_tls_start = global i8 zeroinitializer, section ".tls"
 | 
			
		||||
@_tls_end = global i8 zeroinitializer, section ".tls$ZZZ"
 | 
			
		||||
@_tls_index = global i64 0
 | 
			
		||||
 | 
			
		||||
@_tls_used = global %IMAGE_TLS_DIRECTORY64 {
 | 
			
		||||
    i64 ptrtoint (i8* @_tls_start to i64),
 | 
			
		||||
    i64 ptrtoint (i8* @_tls_end to i64),
 | 
			
		||||
    i64 ptrtoint (i64* @_tls_index to i64),
 | 
			
		||||
    i64 0,
 | 
			
		||||
    i32 0,
 | 
			
		||||
    i32 0
 | 
			
		||||
}, section ".rdata$T"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
; 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.
 | 
			
		||||
;
 | 
			
		||||
; aligned_thread_local specifies 'align 32' and so the generated
 | 
			
		||||
; exe should reflect that with a value of IMAGE_SCN_ALIGN_32BYTES
 | 
			
		||||
; in the Characteristics field of the IMAGE_TLS_DIRECTORY
 | 
			
		||||
 | 
			
		||||
; RUN: llc -filetype=obj %S/Inputs/tlssup-32.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 [ (0x0)
 | 
			
		||||
 | 
			
		||||
target triple = "i686-pc-windows-msvc"
 | 
			
		||||
 | 
			
		||||
@aligned_thread_local = thread_local global i32 42, align 32
 | 
			
		||||
 | 
			
		||||
define i32 @main() {
 | 
			
		||||
  %t = load i32, i32* @aligned_thread_local
 | 
			
		||||
  ret i32 %t
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
; 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 [ (0x0)
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue