Skip to content

Commit 3850131

Browse files
authored
[X86] Handle ifuncs in TargetMachine::isLargeGlobalObject() (#74911)
isLargeGlobalObject() didn't handle GlobalIFuncs, resulting in crashes. Treat ifuncs the same as normal Functions.
1 parent 843ea98 commit 3850131

File tree

2 files changed

+114
-15
lines changed

2 files changed

+114
-15
lines changed

llvm/lib/Target/TargetMachine.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,11 @@ bool TargetMachine::isLargeGlobalObject(const GlobalObject *GO) const {
4343
if (getTargetTriple().getArch() != Triple::x86_64)
4444
return false;
4545

46-
if (isa<Function>(GO))
47-
return getCodeModel() == CodeModel::Large;
46+
auto *GV = dyn_cast<GlobalVariable>(GO);
4847

49-
auto *GV = cast<GlobalVariable>(GO);
48+
// Functions/GlobalIFuncs are only large under the large code model.
49+
if (!GV)
50+
return getCodeModel() == CodeModel::Large;
5051

5152
if (GV->isThreadLocal())
5253
return false;

llvm/test/CodeGen/X86/code-model-elf.ll

Lines changed: 110 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,18 @@ define internal void @static_fn() #0 {
583583

584584
declare void @extern_fn()
585585

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+
586598
define dso_local ptr @lea_static_fn() #0 {
587599
; SMALL-STATIC-LABEL: lea_static_fn:
588600
; SMALL-STATIC: # %bb.0:
@@ -616,9 +628,9 @@ define dso_local ptr @lea_static_fn() #0 {
616628
;
617629
; LARGE-PIC-LABEL: lea_static_fn:
618630
; 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
622634
; LARGE-PIC-NEXT: addq %rax, %rcx
623635
; LARGE-PIC-NEXT: movabsq $static_fn@GOTOFF, %rax
624636
; LARGE-PIC-NEXT: addq %rcx, %rax
@@ -659,9 +671,9 @@ define dso_local ptr @lea_global_fn() #0 {
659671
;
660672
; LARGE-PIC-LABEL: lea_global_fn:
661673
; 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
665677
; LARGE-PIC-NEXT: addq %rax, %rcx
666678
; LARGE-PIC-NEXT: movabsq $global_fn@GOTOFF, %rax
667679
; LARGE-PIC-NEXT: addq %rcx, %rax
@@ -702,16 +714,102 @@ define dso_local ptr @lea_extern_fn() #0 {
702714
;
703715
; LARGE-PIC-LABEL: lea_extern_fn:
704716
; 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
708720
; LARGE-PIC-NEXT: addq %rax, %rcx
709721
; LARGE-PIC-NEXT: movabsq $extern_fn@GOT, %rax
710722
; LARGE-PIC-NEXT: movq (%rcx,%rax), %rax
711723
; LARGE-PIC-NEXT: retq
712724
ret ptr @extern_fn
713725
}
714726

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+
715813
; FIXME: The result is same for small, medium and large model, because we
716814
; specify pie option in the test case. And the type of tls is initial exec tls.
717815
; 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 {
780878
;
781879
; LARGE-PIC-LABEL: load_constant_pool:
782880
; 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
786884
; LARGE-PIC-NEXT: addq %rax, %rcx
787885
; LARGE-PIC-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}@GOTOFF, %rax
788886
; LARGE-PIC-NEXT: addss (%rcx,%rax), %xmm0

0 commit comments

Comments
 (0)