Skip to content

Commit f82c85d

Browse files
authored
[X86] Handle unsized types in TargetMachine::isLargeGlobalObject() (#74952)
isLargeGlobalObject() didn't handle opaque types, resulting in crashes.
1 parent a19c7c4 commit f82c85d

File tree

2 files changed

+70
-18
lines changed

2 files changed

+70
-18
lines changed

llvm/lib/Target/TargetMachine.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ bool TargetMachine::isLargeGlobalObject(const GlobalObject *GO) const {
7979

8080
if (getCodeModel() == CodeModel::Medium ||
8181
getCodeModel() == CodeModel::Large) {
82+
if (!GV->getValueType()->isSized())
83+
return true;
8284
const DataLayout &DL = GV->getParent()->getDataLayout();
8385
uint64_t Size = DL.getTypeSizeInBits(GV->getValueType()) / 8;
8486
return Size == 0 || Size > LargeDataThreshold;

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

Lines changed: 68 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,14 @@ source_filename = "model.c"
3636
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
3737
target triple = "x86_64--linux"
3838

39+
%t = type opaque
40+
3941
@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
4042
@static_data = internal global [10 x i32] zeroinitializer, align 16
4143
@extern_data = external global [10 x i32], align 16
4244
@thread_data = external thread_local global i32, align 4
4345
@unknown_size_data = dso_local global [0 x i32] zeroinitializer, align 16
46+
@opaque = external dso_local global %t
4447
@forced_small_data = dso_local global [10 x i32] zeroinitializer, code_model "small", align 16
4548
@forced_large_data = dso_local global [10 x i32] zeroinitializer, code_model "large", align 16
4649

@@ -567,6 +570,53 @@ define dso_local i32 @load_unknown_size_data() #0 {
567570
ret i32 %rv
568571
}
569572

573+
define dso_local ptr @lea_opaque() #0 {
574+
; SMALL-STATIC-LABEL: lea_opaque:
575+
; SMALL-STATIC: # %bb.0:
576+
; SMALL-STATIC-NEXT: movl $opaque, %eax
577+
; SMALL-STATIC-NEXT: retq
578+
;
579+
; MEDIUM-STATIC-LABEL: lea_opaque:
580+
; MEDIUM-STATIC: # %bb.0:
581+
; MEDIUM-STATIC-NEXT: movabsq $opaque, %rax
582+
; MEDIUM-STATIC-NEXT: retq
583+
;
584+
; LARGE-STATIC-LABEL: lea_opaque:
585+
; LARGE-STATIC: # %bb.0:
586+
; LARGE-STATIC-NEXT: movabsq $opaque, %rax
587+
; LARGE-STATIC-NEXT: retq
588+
;
589+
; SMALL-PIC-LABEL: lea_opaque:
590+
; SMALL-PIC: # %bb.0:
591+
; SMALL-PIC-NEXT: leaq opaque(%rip), %rax
592+
; SMALL-PIC-NEXT: retq
593+
;
594+
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_opaque:
595+
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
596+
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
597+
; MEDIUM-SMALL-DATA-PIC-NEXT: movabsq $opaque@GOTOFF, %rax
598+
; MEDIUM-SMALL-DATA-PIC-NEXT: addq %rcx, %rax
599+
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
600+
;
601+
; MEDIUM-PIC-LABEL: lea_opaque:
602+
; MEDIUM-PIC: # %bb.0:
603+
; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
604+
; MEDIUM-PIC-NEXT: movabsq $opaque@GOTOFF, %rax
605+
; MEDIUM-PIC-NEXT: addq %rcx, %rax
606+
; MEDIUM-PIC-NEXT: retq
607+
;
608+
; LARGE-PIC-LABEL: lea_opaque:
609+
; LARGE-PIC: # %bb.0:
610+
; LARGE-PIC-NEXT: .L11$pb:
611+
; LARGE-PIC-NEXT: leaq .L11$pb(%rip), %rax
612+
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L11$pb, %rcx
613+
; LARGE-PIC-NEXT: addq %rax, %rcx
614+
; LARGE-PIC-NEXT: movabsq $opaque@GOTOFF, %rax
615+
; LARGE-PIC-NEXT: addq %rcx, %rax
616+
; LARGE-PIC-NEXT: retq
617+
ret ptr @opaque
618+
}
619+
570620
define dso_local void @global_fn() #0 {
571621
; CHECK-LABEL: global_fn:
572622
; CHECK: # %bb.0:
@@ -628,9 +678,9 @@ define dso_local ptr @lea_static_fn() #0 {
628678
;
629679
; LARGE-PIC-LABEL: lea_static_fn:
630680
; LARGE-PIC: # %bb.0:
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
681+
; LARGE-PIC-NEXT: .L15$pb:
682+
; LARGE-PIC-NEXT: leaq .L15$pb(%rip), %rax
683+
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L15$pb, %rcx
634684
; LARGE-PIC-NEXT: addq %rax, %rcx
635685
; LARGE-PIC-NEXT: movabsq $static_fn@GOTOFF, %rax
636686
; LARGE-PIC-NEXT: addq %rcx, %rax
@@ -671,9 +721,9 @@ define dso_local ptr @lea_global_fn() #0 {
671721
;
672722
; LARGE-PIC-LABEL: lea_global_fn:
673723
; LARGE-PIC: # %bb.0:
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
724+
; LARGE-PIC-NEXT: .L16$pb:
725+
; LARGE-PIC-NEXT: leaq .L16$pb(%rip), %rax
726+
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L16$pb, %rcx
677727
; LARGE-PIC-NEXT: addq %rax, %rcx
678728
; LARGE-PIC-NEXT: movabsq $global_fn@GOTOFF, %rax
679729
; LARGE-PIC-NEXT: addq %rcx, %rax
@@ -714,9 +764,9 @@ define dso_local ptr @lea_extern_fn() #0 {
714764
;
715765
; LARGE-PIC-LABEL: lea_extern_fn:
716766
; LARGE-PIC: # %bb.0:
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
767+
; LARGE-PIC-NEXT: .L17$pb:
768+
; LARGE-PIC-NEXT: leaq .L17$pb(%rip), %rax
769+
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L17$pb, %rcx
720770
; LARGE-PIC-NEXT: addq %rax, %rcx
721771
; LARGE-PIC-NEXT: movabsq $extern_fn@GOT, %rax
722772
; LARGE-PIC-NEXT: movq (%rcx,%rax), %rax
@@ -757,9 +807,9 @@ define dso_local ptr @lea_ifunc() #0 {
757807
;
758808
; LARGE-PIC-LABEL: lea_ifunc:
759809
; 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
810+
; LARGE-PIC-NEXT: .L18$pb:
811+
; LARGE-PIC-NEXT: leaq .L18$pb(%rip), %rax
812+
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L18$pb, %rcx
763813
; LARGE-PIC-NEXT: addq %rax, %rcx
764814
; LARGE-PIC-NEXT: movabsq $ifunc_func@GOT, %rax
765815
; LARGE-PIC-NEXT: movq (%rcx,%rax), %rax
@@ -800,9 +850,9 @@ define dso_local ptr @lea_dso_local_ifunc() #0 {
800850
;
801851
; LARGE-PIC-LABEL: lea_dso_local_ifunc:
802852
; 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
853+
; LARGE-PIC-NEXT: .L19$pb:
854+
; LARGE-PIC-NEXT: leaq .L19$pb(%rip), %rax
855+
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L19$pb, %rcx
806856
; LARGE-PIC-NEXT: addq %rax, %rcx
807857
; LARGE-PIC-NEXT: movabsq $dso_local_ifunc_func@GOTOFF, %rax
808858
; LARGE-PIC-NEXT: addq %rcx, %rax
@@ -878,9 +928,9 @@ define dso_local float @load_constant_pool(float %x) #0 {
878928
;
879929
; LARGE-PIC-LABEL: load_constant_pool:
880930
; LARGE-PIC: # %bb.0:
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
931+
; LARGE-PIC-NEXT: .L21$pb:
932+
; LARGE-PIC-NEXT: leaq .L21$pb(%rip), %rax
933+
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L21$pb, %rcx
884934
; LARGE-PIC-NEXT: addq %rax, %rcx
885935
; LARGE-PIC-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}@GOTOFF, %rax
886936
; LARGE-PIC-NEXT: addss (%rcx,%rax), %xmm0

0 commit comments

Comments
 (0)