@@ -37,6 +37,8 @@ target triple = "x86_64--linux"
37
37
@global_data = dso_local global [10 x i32 ] [i32 1 , i32 2 , i32 0 , i32 0 , i32 0 , i32 0 , i32 0 , i32 0 , i32 0 , i32 0 ], align 16
38
38
@static_data = internal global [10 x i32 ] zeroinitializer , align 16
39
39
@extern_data = external global [10 x i32 ], align 16
40
+ @thread_data = external thread_local global i32 , align 4
41
+
40
42
41
43
define dso_local i32* @lea_static_data () #0 {
42
44
; SMALL-STATIC-LABEL: lea_static_data:
@@ -373,6 +375,70 @@ define dso_local void ()* @lea_extern_fn() #0 {
373
375
ret void ()* @extern_fn
374
376
}
375
377
378
+ ; FIXME: The result is same for small, medium and large model, because we
379
+ ; specify pie option in the test case. And the type of tls is initial exec tls.
380
+ ; For pic code. The large model code for pic tls should be emitted as below.
381
+
382
+ ; .L3:
383
+ ; leaq .L3(%rip), %rbx
384
+ ; movabsq $_GLOBAL_OFFSET_TABLE_-.L3, %r11
385
+ ; addq %r11, %rbx
386
+ ; leaq thread_data@TLSGD(%rip), %rdi
387
+ ; movabsq $__tls_get_addr@PLTOFF, %rax
388
+ ; addq %rbx, %rax
389
+ ; call *%rax
390
+ ; movl (%rax), %eax
391
+
392
+ ; The medium and small model code for pic tls should be emitted as below.
393
+ ; data16
394
+ ; leaq thread_data@TLSGD(%rip), %rdi
395
+ ; data16
396
+ ; data16
397
+ ; rex64
398
+ ; callq __tls_get_addr@PLT
399
+ ; movl (%rax), %eax
400
+
401
+ define dso_local i32 @load_thread_data () #0 {
402
+ ; SMALL-STATIC-LABEL: load_thread_data:
403
+ ; SMALL-STATIC: # %bb.0:
404
+ ; SMALL-STATIC-NEXT: movq thread_data@GOTTPOFF(%rip), %rax
405
+ ; SMALL-STATIC-NEXT: movl %fs:(%rax), %eax
406
+ ; SMALL-STATIC-NEXT: retq
407
+ ;
408
+ ; MEDIUM-STATIC-LABEL: load_thread_data:
409
+ ; MEDIUM-STATIC: # %bb.0:
410
+ ; MEDIUM-STATIC-NEXT: movq thread_data@GOTTPOFF(%rip), %rax
411
+ ; MEDIUM-STATIC-NEXT: movl %fs:(%rax), %eax
412
+ ; MEDIUM-STATIC-NEXT: retq
413
+ ;
414
+ ; LARGE-STATIC-LABEL: load_thread_data:
415
+ ; LARGE-STATIC: # %bb.0:
416
+ ; LARGE-STATIC-NEXT: movq thread_data@GOTTPOFF(%rip), %rax
417
+ ; LARGE-STATIC-NEXT: movl %fs:(%rax), %eax
418
+ ; LARGE-STATIC-NEXT: retq
419
+ ;
420
+ ; SMALL-PIC-LABEL: load_thread_data:
421
+ ; SMALL-PIC: # %bb.0:
422
+ ; SMALL-PIC-NEXT: movq thread_data@GOTTPOFF(%rip), %rax
423
+ ; SMALL-PIC-NEXT: movl %fs:(%rax), %eax
424
+ ; SMALL-PIC-NEXT: retq
425
+ ;
426
+ ; MEDIUM-PIC-LABEL: load_thread_data:
427
+ ; MEDIUM-PIC: # %bb.0:
428
+ ; MEDIUM-PIC-NEXT: movq thread_data@GOTTPOFF(%rip), %rax
429
+ ; MEDIUM-PIC-NEXT: movl %fs:(%rax), %eax
430
+ ; MEDIUM-PIC-NEXT: retq
431
+ ;
432
+ ; LARGE-PIC-LABEL: load_thread_data:
433
+ ; LARGE-PIC: # %bb.0:
434
+ ; LARGE-PIC-NEXT: movq thread_data@GOTTPOFF(%rip), %rax
435
+ ; LARGE-PIC-NEXT: movl %fs:(%rax), %eax
436
+ ; LARGE-PIC-NEXT: retq
437
+ ;
438
+ %1 = load i32 , i32* @thread_data , align 4
439
+ ret i32 %1
440
+ }
441
+
376
442
attributes #0 = { noinline nounwind uwtable }
377
443
378
444
!llvm.module.flags = !{!0 , !1 , !2 }
0 commit comments