@@ -583,6 +583,18 @@ define internal void @static_fn() #0 {
583
583
584
584
declare void @extern_fn ()
585
585
586
+ @ifunc_func = ifunc void (), ptr @resolver
587
+ @dso_local_ifunc_func = dso_local ifunc void (), ptr @resolver
588
+
589
+ define internal ptr @resolver () {
590
+ ; CHECK-LABEL: resolver:
591
+ ; CHECK: # %bb.0: # %entry
592
+ ; CHECK-NEXT: xorl %eax, %eax
593
+ ; CHECK-NEXT: retq
594
+ entry:
595
+ ret ptr null
596
+ }
597
+
586
598
define dso_local ptr @lea_static_fn () #0 {
587
599
; SMALL-STATIC-LABEL: lea_static_fn:
588
600
; SMALL-STATIC: # %bb.0:
@@ -616,9 +628,9 @@ define dso_local ptr @lea_static_fn() #0 {
616
628
;
617
629
; LARGE-PIC-LABEL: lea_static_fn:
618
630
; LARGE-PIC: # %bb.0:
619
- ; LARGE-PIC-NEXT: .L13 $pb:
620
- ; LARGE-PIC-NEXT: leaq .L13 $pb(%rip), %rax
621
- ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L13 $pb, %rcx
631
+ ; LARGE-PIC-NEXT: .L14 $pb:
632
+ ; LARGE-PIC-NEXT: leaq .L14 $pb(%rip), %rax
633
+ ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L14 $pb, %rcx
622
634
; LARGE-PIC-NEXT: addq %rax, %rcx
623
635
; LARGE-PIC-NEXT: movabsq $static_fn@GOTOFF, %rax
624
636
; LARGE-PIC-NEXT: addq %rcx, %rax
@@ -659,9 +671,9 @@ define dso_local ptr @lea_global_fn() #0 {
659
671
;
660
672
; LARGE-PIC-LABEL: lea_global_fn:
661
673
; LARGE-PIC: # %bb.0:
662
- ; LARGE-PIC-NEXT: .L14 $pb:
663
- ; LARGE-PIC-NEXT: leaq .L14 $pb(%rip), %rax
664
- ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L14 $pb, %rcx
674
+ ; LARGE-PIC-NEXT: .L15 $pb:
675
+ ; LARGE-PIC-NEXT: leaq .L15 $pb(%rip), %rax
676
+ ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L15 $pb, %rcx
665
677
; LARGE-PIC-NEXT: addq %rax, %rcx
666
678
; LARGE-PIC-NEXT: movabsq $global_fn@GOTOFF, %rax
667
679
; LARGE-PIC-NEXT: addq %rcx, %rax
@@ -702,16 +714,102 @@ define dso_local ptr @lea_extern_fn() #0 {
702
714
;
703
715
; LARGE-PIC-LABEL: lea_extern_fn:
704
716
; LARGE-PIC: # %bb.0:
705
- ; LARGE-PIC-NEXT: .L15 $pb:
706
- ; LARGE-PIC-NEXT: leaq .L15 $pb(%rip), %rax
707
- ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L15 $pb, %rcx
717
+ ; LARGE-PIC-NEXT: .L16 $pb:
718
+ ; LARGE-PIC-NEXT: leaq .L16 $pb(%rip), %rax
719
+ ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L16 $pb, %rcx
708
720
; LARGE-PIC-NEXT: addq %rax, %rcx
709
721
; LARGE-PIC-NEXT: movabsq $extern_fn@GOT, %rax
710
722
; LARGE-PIC-NEXT: movq (%rcx,%rax), %rax
711
723
; LARGE-PIC-NEXT: retq
712
724
ret ptr @extern_fn
713
725
}
714
726
727
+ define dso_local ptr @lea_ifunc () #0 {
728
+ ; SMALL-STATIC-LABEL: lea_ifunc:
729
+ ; SMALL-STATIC: # %bb.0:
730
+ ; SMALL-STATIC-NEXT: movq ifunc_func@GOTPCREL(%rip), %rax
731
+ ; SMALL-STATIC-NEXT: retq
732
+ ;
733
+ ; MEDIUM-STATIC-LABEL: lea_ifunc:
734
+ ; MEDIUM-STATIC: # %bb.0:
735
+ ; MEDIUM-STATIC-NEXT: movq ifunc_func@GOTPCREL(%rip), %rax
736
+ ; MEDIUM-STATIC-NEXT: retq
737
+ ;
738
+ ; LARGE-STATIC-LABEL: lea_ifunc:
739
+ ; LARGE-STATIC: # %bb.0:
740
+ ; LARGE-STATIC-NEXT: movabsq $ifunc_func, %rax
741
+ ; LARGE-STATIC-NEXT: retq
742
+ ;
743
+ ; SMALL-PIC-LABEL: lea_ifunc:
744
+ ; SMALL-PIC: # %bb.0:
745
+ ; SMALL-PIC-NEXT: movq ifunc_func@GOTPCREL(%rip), %rax
746
+ ; SMALL-PIC-NEXT: retq
747
+ ;
748
+ ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_ifunc:
749
+ ; MEDIUM-SMALL-DATA-PIC: # %bb.0:
750
+ ; MEDIUM-SMALL-DATA-PIC-NEXT: movq ifunc_func@GOTPCREL(%rip), %rax
751
+ ; MEDIUM-SMALL-DATA-PIC-NEXT: retq
752
+ ;
753
+ ; MEDIUM-PIC-LABEL: lea_ifunc:
754
+ ; MEDIUM-PIC: # %bb.0:
755
+ ; MEDIUM-PIC-NEXT: movq ifunc_func@GOTPCREL(%rip), %rax
756
+ ; MEDIUM-PIC-NEXT: retq
757
+ ;
758
+ ; LARGE-PIC-LABEL: lea_ifunc:
759
+ ; LARGE-PIC: # %bb.0:
760
+ ; LARGE-PIC-NEXT: .L17$pb:
761
+ ; LARGE-PIC-NEXT: leaq .L17$pb(%rip), %rax
762
+ ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L17$pb, %rcx
763
+ ; LARGE-PIC-NEXT: addq %rax, %rcx
764
+ ; LARGE-PIC-NEXT: movabsq $ifunc_func@GOT, %rax
765
+ ; LARGE-PIC-NEXT: movq (%rcx,%rax), %rax
766
+ ; LARGE-PIC-NEXT: retq
767
+ ret ptr @ifunc_func
768
+ }
769
+
770
+ define dso_local ptr @lea_dso_local_ifunc () #0 {
771
+ ; SMALL-STATIC-LABEL: lea_dso_local_ifunc:
772
+ ; SMALL-STATIC: # %bb.0:
773
+ ; SMALL-STATIC-NEXT: movl $dso_local_ifunc_func, %eax
774
+ ; SMALL-STATIC-NEXT: retq
775
+ ;
776
+ ; MEDIUM-STATIC-LABEL: lea_dso_local_ifunc:
777
+ ; MEDIUM-STATIC: # %bb.0:
778
+ ; MEDIUM-STATIC-NEXT: movabsq $dso_local_ifunc_func, %rax
779
+ ; MEDIUM-STATIC-NEXT: retq
780
+ ;
781
+ ; LARGE-STATIC-LABEL: lea_dso_local_ifunc:
782
+ ; LARGE-STATIC: # %bb.0:
783
+ ; LARGE-STATIC-NEXT: movabsq $dso_local_ifunc_func, %rax
784
+ ; LARGE-STATIC-NEXT: retq
785
+ ;
786
+ ; SMALL-PIC-LABEL: lea_dso_local_ifunc:
787
+ ; SMALL-PIC: # %bb.0:
788
+ ; SMALL-PIC-NEXT: leaq dso_local_ifunc_func(%rip), %rax
789
+ ; SMALL-PIC-NEXT: retq
790
+ ;
791
+ ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_dso_local_ifunc:
792
+ ; MEDIUM-SMALL-DATA-PIC: # %bb.0:
793
+ ; MEDIUM-SMALL-DATA-PIC-NEXT: leaq dso_local_ifunc_func(%rip), %rax
794
+ ; MEDIUM-SMALL-DATA-PIC-NEXT: retq
795
+ ;
796
+ ; MEDIUM-PIC-LABEL: lea_dso_local_ifunc:
797
+ ; MEDIUM-PIC: # %bb.0:
798
+ ; MEDIUM-PIC-NEXT: leaq dso_local_ifunc_func(%rip), %rax
799
+ ; MEDIUM-PIC-NEXT: retq
800
+ ;
801
+ ; LARGE-PIC-LABEL: lea_dso_local_ifunc:
802
+ ; LARGE-PIC: # %bb.0:
803
+ ; LARGE-PIC-NEXT: .L18$pb:
804
+ ; LARGE-PIC-NEXT: leaq .L18$pb(%rip), %rax
805
+ ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L18$pb, %rcx
806
+ ; LARGE-PIC-NEXT: addq %rax, %rcx
807
+ ; LARGE-PIC-NEXT: movabsq $dso_local_ifunc_func@GOTOFF, %rax
808
+ ; LARGE-PIC-NEXT: addq %rcx, %rax
809
+ ; LARGE-PIC-NEXT: retq
810
+ ret ptr @dso_local_ifunc_func
811
+ }
812
+
715
813
; FIXME: The result is same for small, medium and large model, because we
716
814
; specify pie option in the test case. And the type of tls is initial exec tls.
717
815
; For pic code. The large model code for pic tls should be emitted as below.
@@ -780,9 +878,9 @@ define dso_local float @load_constant_pool(float %x) #0 {
780
878
;
781
879
; LARGE-PIC-LABEL: load_constant_pool:
782
880
; LARGE-PIC: # %bb.0:
783
- ; LARGE-PIC-NEXT: .L17 $pb:
784
- ; LARGE-PIC-NEXT: leaq .L17 $pb(%rip), %rax
785
- ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L17 $pb, %rcx
881
+ ; LARGE-PIC-NEXT: .L20 $pb:
882
+ ; LARGE-PIC-NEXT: leaq .L20 $pb(%rip), %rax
883
+ ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L20 $pb, %rcx
786
884
; LARGE-PIC-NEXT: addq %rax, %rcx
787
885
; LARGE-PIC-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}@GOTOFF, %rax
788
886
; LARGE-PIC-NEXT: addss (%rcx,%rax), %xmm0
0 commit comments